V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
smith123
V2EX  ›  问与答

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

  •  
  •   smith123 · 2022-10-14 08:18:40 +08:00 · 2572 次点击
    这是一个创建于 790 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用的

            <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 收到不消息,请问各位大佬有啥解决办法吗?

    13 条回复    2022-11-14 14:42:00 +08:00
    vagusss
        1
    vagusss  
       2022-10-14 08:50:57 +08:00
    客户端搞个断开重连机制
    smith123
        2
    smith123  
    OP
       2022-10-14 09:21:24 +08:00
    @vagusss 弄了重连机制,但是我是在做 ping 之前发现断开才会重连,就怕业务执行完了准备发消息,但是 websocket 还没重连上,咋办?
    ksco
        3
    ksco  
       2022-10-14 09:28:03 +08:00
    1. 加心跳( PING/PONG frame );
    2. 服务端维护队列,如果没有和客户端连接成功,就先把消息放到队列中暂存。
    cxe2v
        4
    cxe2v  
       2022-10-14 09:29:00 +08:00
    @smith123 #2 业务端要求收个回执啊,没收到间断时间重发
    gesse
        5
    gesse  
       2022-10-14 09:33:05 +08:00
    先把问题简单化
    你先建立一个普通的 tcp 连接, 设置 keepalive ,看看会不会被阻断,看是否能找到原因。
    whajcf
        6
    whajcf  
       2022-10-14 09:35:45 +08:00
    环境问题 我们 4 套 k8s 环境 其中一套阿里云功能就是这个情况 排查到最后就是网关的配置问题
    解决办法就是业务放队列 加重发机制 加回执
    coderxy
        7
    coderxy  
       2022-10-14 09:38:21 +08:00
    大概率是中间某个环节出了问题造成连接被中断。 可以做测试,最后确定到底是哪两个节点之间出的问题
    des
        8
    des  
       2022-10-14 09:38:31 +08:00 via iPhone
    看看是不是准时一个小时?如果是的话那就是某处有超时
    lambdaq
        9
    lambdaq  
       2022-10-14 09:41:46 +08:00
    很显然,org.java-websocket 和浏览器之间还有个比如 nginx 之类的可以撑 60 分钟不掉线的中间件
    xiaoshenghaohao
        10
    xiaoshenghaohao  
       2022-10-14 10:38:26 +08:00
    @lambdaq 赞同,估计 nginx 设置的时间 proxy_connect_timeout ,proxy_read_timeout ,proxy_send_timeout 应该是 60 分钟
    yxisenx
        11
    yxisenx  
       2022-10-14 10:43:13 +08:00
    @smith123 业务执行完发送消息,客户端收到消息,给服务器一个确认, 没确认就下次连上发
    ytmsdy
        12
    ytmsdy  
       2022-10-14 10:59:25 +08:00
    之前也遇到过这个问题,连着好好的,但是会断。
    我的处理方式是这样的,把接受到的消息直接 push 到 redis 里面,提高响应速度。
    然后用单独的程序,把 redis 里面的数据 pop 出来。
    这么处理以后,就没有再出现过问题了。
    后来我想了想有可能是服务端的 WebSotket 觉得你响应太慢了,然后把通信给关掉了。
    angryPHP
        13
    angryPHP  
       2022-11-14 14:42:00 +08:00
    楼主解决了没
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5024 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 07:53 · PVG 15:53 · LAX 23:53 · JFK 02:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.