WebSocket 心跳正常,但是也会断开,请问怎么回事? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
smith123
V2EX    问与答

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

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

    使用的

     <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     Solana     934 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 19:54 PVG 03:54 LAX 12:54 JFK 15:54
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86