WebSocket 心跳正常,但是也会断开,请问怎么回事?

2022-10-14 08:18:40 +08:00
 smith123

使用的

        <dependency>
            <groupId>org.java-websocket</groupId>
            <artifactId>Java-WebSocket</artifactId>
            <version>1.5.1</version>
        </dependency>

作为 websocket 客户端,server 端使用的

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency

server 端放在 k8s 上,以 pod 的方式启动,没有 nginx.

目前情况是我 client 端每隔一分钟发送一次 ping 信息,但是 websocket 连接还是在一个小时后断开,client 端收到的 code 是 1006 ,请问有大佬知道怎么回事吗?应该怎么避免呢?

因为我们的业务是先建立 websocket 连接,然后请求 rest 接口,rest 接口 http 连接会在 10 分钟后超时,所以我们期望 rest 接口业务完成后(大概率一个小时以上)通过 websocket 推消息,但目前 websocket 会在一个小时后断开,极端情况下 websocket 重连的同时 rest 接口完成了,这样就会导致 websocket 收到不消息,请问各位大佬有啥解决办法吗?

2589 次点击
所在节点    问与答
13 条回复
vagusss
2022-10-14 08:50:57 +08:00
客户端搞个断开重连机制
smith123
2022-10-14 09:21:24 +08:00
@vagusss 弄了重连机制,但是我是在做 ping 之前发现断开才会重连,就怕业务执行完了准备发消息,但是 websocket 还没重连上,咋办?
ksco
2022-10-14 09:28:03 +08:00
1. 加心跳( PING/PONG frame );
2. 服务端维护队列,如果没有和客户端连接成功,就先把消息放到队列中暂存。
cxe2v
2022-10-14 09:29:00 +08:00
@smith123 #2 业务端要求收个回执啊,没收到间断时间重发
gesse
2022-10-14 09:33:05 +08:00
先把问题简单化
你先建立一个普通的 tcp 连接, 设置 keepalive ,看看会不会被阻断,看是否能找到原因。
whajcf
2022-10-14 09:35:45 +08:00
环境问题 我们 4 套 k8s 环境 其中一套阿里云功能就是这个情况 排查到最后就是网关的配置问题
解决办法就是业务放队列 加重发机制 加回执
coderxy
2022-10-14 09:38:21 +08:00
大概率是中间某个环节出了问题造成连接被中断。 可以做测试,最后确定到底是哪两个节点之间出的问题
des
2022-10-14 09:38:31 +08:00
看看是不是准时一个小时?如果是的话那就是某处有超时
lambdaq
2022-10-14 09:41:46 +08:00
很显然,org.java-websocket 和浏览器之间还有个比如 nginx 之类的可以撑 60 分钟不掉线的中间件
xiaoshenghaohao
2022-10-14 10:38:26 +08:00
@lambdaq 赞同,估计 nginx 设置的时间 proxy_connect_timeout ,proxy_read_timeout ,proxy_send_timeout 应该是 60 分钟
yxisenx
2022-10-14 10:43:13 +08:00
@smith123 业务执行完发送消息,客户端收到消息,给服务器一个确认, 没确认就下次连上发
ytmsdy
2022-10-14 10:59:25 +08:00
之前也遇到过这个问题,连着好好的,但是会断。
我的处理方式是这样的,把接受到的消息直接 push 到 redis 里面,提高响应速度。
然后用单独的程序,把 redis 里面的数据 pop 出来。
这么处理以后,就没有再出现过问题了。
后来我想了想有可能是服务端的 WebSotket 觉得你响应太慢了,然后把通信给关掉了。
angryPHP
2022-11-14 14:42:00 +08:00
楼主解决了没

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/886801

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX