Giter Club home page Giter Club logo

gochat's People

Contributors

brownchow avatar her-cat avatar jiuyuan-light avatar lockgit avatar zjzjzjzj1874 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gochat's Issues

如何群发消息或通知?

看了logic模块的api,只看到了push(点对点)、pushRoom(组发)的接口,没看到群发通知的接口,难不成是push循环调用?或者是pushRoom到所有roomid ?

实际运行中遇到的问题

作者您好,测试 /push/push 这个 api 层接口的时候,task 层遇到报错:INFO[0017] get rpc client err : no connect layer ip:
原因是在 /task/rpc.go 中的 connectRpc, err := RClient.GetRpcClientByServerId(serverId) 时,serverId 为空。
经过排查,发现此参数为空源头是在 logic 层 /logic/rpc.go 中执行 serverIdStr := RedisSessClient.Get(ctx, userSidKey).Val() 时,redis 中没有 userSidKey 这个变量值的 key,此 key 是以 "gochat_" 为前缀,定义为 config 中的常量,该常量只被使用过一次就是在 func (logic *Logic) getUserKey(authKey string) string 这个方法中,除此之外就没有了。

这里这个从 logic 层带到 task 层的 serverId 的作用是什么,代码衔接是否有逻辑上的错误。

docker相关

docker启动后如何查看各层的日志呢,docker logs里面好像看不到

关于task层中的todo的想法

关于task中push.go里的todo

//@todo when arg.ServerId server is down, user could be reconnect other serverId but msg in queue no consume
task.pushSingleToConnect(arg.ServerId, arg.UserId, arg.Msg)

因为在task里已经维护了关于connect层的serverId信息,那是不是只要做一个if判断就可以实现,也就是说如果当前serverId在task层里查找不到(服务失效)的话,就遍历task维护的connect层信息找到另一个有效的connect服务

connect tcp监听的疑惑

func (c *Connect) InitTcpServer() error {
	aTcpAddr := strings.Split(config.Conf.Connect.ConnectTcp.Bind, ",")
	cpuNum := config.Conf.Connect.ConnectBucket.CpuNum
	var (
		addr     *net.TCPAddr
		listener *net.TCPListener
		err      error
	)
	for _, ipPort := range aTcpAddr {
		if addr, err = net.ResolveTCPAddr("tcp", ipPort); err != nil {
			logrus.Errorf("server_tcp ResolveTCPAddr error:%s", err.Error())
			return err
		}
		if listener, err = net.ListenTCP("tcp", addr); err != nil {
			logrus.Errorf("net.ListenTCP(tcp, %s),error(%v)", ipPort, err)
			return err
		}
		logrus.Infof("start tcp listen at:%s", ipPort)
		// cpu core num
		for i := 0; i < cpuNum; i++ {
			go c.acceptTcp(listener)
		}
	}
	return nil
}

connect层 server_tcp.go文件中为什么要开cpu数量的线程来处理请求呢这样做的目的是什么呢不太懂大佬能解答下吗

请问有交流群吗

项目小白想要学习,但是不知道从何入手,能否提供一些帮助,有偿

对于加锁和解锁的操作为什么不使用defer

func (b *Bucket) Room(rid int) (room *Room) {
b.cLock.RLock()
room, _ = b.rooms[rid]
b.cLock.RUnlock()
return
}

不写作
func (b *Bucket) Room(rid int) (room *Room){
b.cLock.RLock()
defer b.cLock.Unlock()
room, _ = b.rooms[rid]
return
}

架构合理吗?

没有做过微服务架构,但我认为一个不大的程序分成这么多服务真的合理吗?各个服务之间有通讯成本,整个程序也增加了很多管理的成本。

go mod tidy

go mod tidy 后包更新了 编译有问题

关于服务端保存websocket.conn的疑惑

保存conn时用到了bucket, 这个在最下层还是使用了map
golang中的map有一个很大的问题:delete根本就没有真删除,只是标识了一下,也就是说内存根本就没有free
随着conn的进进出出,长时间运行下去这块内存是不是泄露了呢(内存会慢慢增加),这只是我的一个疑惑

note: 看map源码, 它实际有一个扩容机制,如果达到扩容条件时,会新建map底层数据(原来的内存就会被free),这样想想好像也不会存在上面的问题

望大哥说说你的想法呢

timing.png中第5步是怎么实现的?

1、本地使用./gochat.bin -module logic &命令部署。
2、问题:在web界面登陆成功后,“在线人数”为0,发送消息后,无法回显在web界面。
3、已定位到connect_tcp层中PushRoom中b.Room(1)为nil,导致无法继续执行。
func (b *Bucket) PushRoom(ch chan *proto.PushRoomMsgRequest) { for { var ( arg *proto.PushRoomMsgRequest room *Room ) arg = <-ch if room = b.Room(arg.RoomId); room != nil { room.Push(&arg.Msg) } } }
4、继续找给b.Room赋值的地方,发现在tcpserver接收连接后,但是listener.AcceptTCP阻塞,一直没有tcpclient连接。不知道tcpclient如何发起connect,这个对应timing.png中第5步?

connect设计有问题

  1. push 进去 select 如果sender满,消息是不是丢失了
  2. 如果链接关闭,是否要对sender channel进行关闭? 如果关闭了,是不是很多环节都不可靠了?

调试问题

因为第一次接触微服务的项目,想问一下作者是怎么进行后端调试的呀,每次修改都要重新编译吗

window下syscall.SIGTSTP找不到

报错信息:

gochat/api

api\chat.go:56:88: undefined: syscall.SIGTSTP
我查了一下,似乎是window中的go没有这个变量。有没有什么解决办法?在window中可以用哪个变量代替呢?

对于加锁和解锁操作为什么不使用defer

func (b *Bucket) Room(rid int) (room *Room) {
b.cLock.RLock()
room, _ = b.rooms[rid]
b.cLock.RUnlock()
return
}
为何不写作
func (b *Bucket) Room(rid int) (room *Room) {
b.cLock.RLock()
defer b.cLock.RUnlock()
room, _ = b.rooms[rid]
return
}

支持一个客户端连接出席多个聊天室吗

我看到代码里面,channel和客户端链接绑定。出席聊天室时,会更新channel的next/prev, 如果玩家多个room需要出席。channel的 next/prev 会在多个room中来回变动。请问下,是不是我代码阅读后理解有问题,或者说目前这个实现不支持,一条链接出席多个room

演示系统已经不能用了吗?

登录报错:
TypeError: Failed to fetch
at http.tsx:2:12
at c (regeneratorRuntime.js:86:17)
at Generator._invoke (regeneratorRuntime.js:66:24)
at Generator.next (regeneratorRuntime.js:117:21)
at Cn (asyncToGenerator.js:3:20)
at i (asyncToGenerator.js:25:9)
at asyncToGenerator.js:32:7
at new Promise ()
at asyncToGenerator.js:21:12
at Np (http.tsx:1:1)

想问一下task层中PushChannel和PushParams这两个结构的问题

发现Push消息到对应用户的时候用到了如题的两个结构,而Push消息到room中却没有用到,那么这两个结构的意义是啥呢?为什么Push消息到用户的时候不要像PushRoom那样比较直接地去调用connect层服务呢?刚刚接触web,问题傻的话还请见谅。。。

bucket会崩溃

fatal error: concurrent map read and map write

是不是因为60行的room返回的是指针所以仍然会触发b.rooms读写并发。

task 层 etcd 的疑惑

d := client.NewEtcdV3Discovery(etcdConfig.BasePath, etcdConfig.ServerPathConnect, []string{etcdConfig.Host}, nil)

d := client.NewPeer2PeerDiscovery(connectConf.Key, "")

这里 etcd 并没起到作用吧,初始化时已经固定了服务地址,那 etcd 的作用是啥。

开发环境问题

有一个问题:
我clone下代码后,运行 go build ,告诉我需要编译go-sqlite3,并且需要gcc,于是我安装了gcc,之后又报错,提示我不能兼容64位,总之就是很多问题。请问作者的开发环境也是Windows吗?还是Linux?

测试问题

想请问下作者是怎么进行压测的?我想自己测试下极限性能,应该怎么做?

心跳

客户端和服务端建立websocket连接后,客户端不需要定时给服务端发送心跳吗?

发送消息接收不到

task 服务报错信息 level=info msg="task queue block timeout,no msg err:redis: nil"

谁帮忙解决下

作者加油

最近在学习websocket聊天,查阅资料无意间看到作者的项目,感觉自己还很多知识点没有掌握到,离作者的距离还很遥远,向作者学习。最后谢谢你的分享🚀

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.