Closed dmzlingyin closed 3 weeks ago
感谢使用和反馈!
这里session相关的实现和具体的流程不全, 能提供个完整的能复现的简单例子吗我跑下试试
https://github.com/dmzlingyin/gateway-demo
我把核心代码抽离出来了,麻烦大佬看一下。
如果发送消息的频率大于超时时间,就不会有问题。如果频率小于超时时间,就报错:err: write tcp [::1]:8080->[::1]:60682: i/o timeout
这个没有客户端,我没法跑起来去调试错误。 单看代码,这里有没有可能设置了SetWriteDeadline后没有执行WriteMessage? https://github.com/dmzlingyin/gateway-demo/blob/main/server/session.go#L51
建议本地调试或者加日志先看下,可以调试的话看看进入WriteMessage没,如果进入了,后续的write成功没
另外,这种遍历map的没有加锁,估计还会有其他地方并发写吧,那这样都是可能导致宕机的: https://github.com/dmzlingyin/gateway-demo/blob/main/server/server.go#L67
这个没有客户端,我没法跑起来去调试错误。 单看代码,这里有没有可能设置了SetWriteDeadline后没有执行WriteMessage? https://github.com/dmzlingyin/gateway-demo/blob/main/server/session.go#L51
建议本地调试或者加日志先看下,可以调试的话看看进入WriteMessage没,如果进入了,后续的write成功没
webcosket-test.py可以当做客户端调试。
我打印过日志,SetWriteDeadline执行成功了,WriteMessage也执行成功了,客户端也立马收到消息了。
另外,这种遍历map的没有加锁,估计还会有其他地方并发写吧,那这样都是可能导致宕机的: https://github.com/dmzlingyin/gateway-demo/blob/main/server/server.go#L67
目前业务里面还没其他并发写的地方,我就先暂时简单处理了
SetWriteDeadline之后如果没有更新并且已经超时, 那么下次任意写都会导致写失败, 因为已经到期了. 所以每次写之前都应该SetWriteDeadline重置这个时间, 我在这里WriteMessage之前加上试了下, 就没有超时了: https://github.com/dmzlingyin/gateway-demo/blob/main/server/server.go#L79
SetWriteDeadline之后如果没有更新并且已经超时, 那么下次任意写都会导致写失败, 因为已经到期了. 所以每次写之前都应该SetWriteDeadline重置这个时间, 我在这里WriteMessage之前加上试了下, 就没有超时了: https://github.com/dmzlingyin/gateway-demo/blob/main/server/server.go#L79
问题已经解决了,非常感谢大佬的指正!!!
上面是upgrader逻辑
上面是我们业务侧发送消息的代码,首先设置了10s的写超时时间,然后进行发送。有两个比较奇怪的问题:
请问一下,这是什么问题呢