lockgit / gochat Goto Github PK
View Code? Open in Web Editor NEWgoim server write by golang !🚀
Home Page: http://45.77.108.245:8080
License: MIT License
goim server write by golang !🚀
Home Page: http://45.77.108.245:8080
License: MIT License
看了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 logs里面好像看不到
关于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服务
请问有交流群吗
作者您好,第一次看这样目录结构的项目,想请教下这种属于什么架构方式,项目的入口文件是哪一个
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数量的线程来处理请求呢,这样做的目的是什么呢,不太懂,大佬能解答下吗
关注这个项目有一段时间了,感觉如果有一份文档的话会很有用.
或者增加一些测试用例也不错.
如题
vender 可以通过走代理自行下载.
项目小白想要学习,但是不知道从何入手,能否提供一些帮助,有偿
如
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 后包更新了 编译有问题
保存conn时用到了bucket, 这个在最下层还是使用了map
golang中的map有一个很大的问题:delete根本就没有真删除,只是标识了一下,也就是说内存根本就没有free
随着conn的进进出出,长时间运行下去这块内存是不是泄露了呢(内存会慢慢增加),这只是我的一个疑惑
note: 看map源码, 它实际有一个扩容机制,如果达到扩容条件时,会新建map底层数据(原来的内存就会被free),这样想想好像也不会存在上面的问题
望大哥说说你的想法呢
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步?
因为第一次接触微服务的项目,想问一下作者是怎么进行后端调试的呀,每次修改都要重新编译吗
想问下离线消息啥时候能支持下啊?
./gochat.bin -module logic卡住不动了。把main.go里的connect部分的代码临时注释掉,程序打印运行都正常了,是不是connect的部分代码占用资源过大?还是这部分代码有bug导致的?
报错信息:
api\chat.go:56:88: undefined: syscall.SIGTSTP
我查了一下,似乎是window中的go没有这个变量。有没有什么解决办法?在window中可以用哪个变量代替呢?
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)
发现Push消息到对应用户的时候用到了如题的两个结构,而Push消息到room中却没有用到,那么这两个结构的意义是啥呢?为什么Push消息到用户的时候不要像PushRoom那样比较直接地去调用connect层服务呢?刚刚接触web,问题傻的话还请见谅。。。
fatal error: concurrent map read and map write
是不是因为60行的room返回的是指针所以仍然会触发b.rooms读写并发。
👏
为什么不在 logic 层直接 rpc connect发送消息呢,这是出于什么考虑,可否解答一下!
fatal: repository 'https://github.com/rpcx-ecosystem/quic-conn/' not found
有木有移动端版本?
例如flutter ,android ,ios
看到后端的逻辑有支持私信,但是前端没支持是吗?
有一个问题:
我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聊天,查阅资料无意间看到作者的项目,感觉自己还很多知识点没有掌握到,离作者的距离还很遥远,向作者学习。最后谢谢你的分享🚀
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.