WebSocket 频繁爆出异常 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
looveh
V2EX    WebSocket

WebSocket 频繁爆出异常

  •  
  •   looveh 2023-10-23 09:55:27 +08:00 2424 次点击
    这是一个创建于 718 天前的主题,其中的信息可能已经有所发展或是发生改变。

    做了个 WebSocket 连接,客户端通过定时发送心跳。但是时间一长发现还是会自动断开,心跳时间是 30s 一次,ng 也做了如下配置:

    proxy-read-timeout:'3600' proxy-send-timeout:'3600' 
    p>有没有大佬出现过这种情况? 错误如下:

     java.io.EOFException: null at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1345) at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1255) at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:75) at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:183) at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:162) at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:156) at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:60) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:59) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:829) 
    第 1 条附言    2023-10-23 19:47:43 +08:00
    补充一下,目前的状态是前端和后端都会互相做心跳,前端还有断线重连机制。因为某些业务需要达到 100%到达率。所以任何异常都有可能导致消息推送失败。不知道从哪里下手了
    23 条回复    2023-10-26 16:28:42 +08:00
    coderxy
        1
    coderxy  
       2023-10-23 10:02:27 +08:00
    断开很正常吧? 中间任何一个环节网络波动啥的都会导致断开, 做好重连不就行了?
    opengps
        2
    opengps  
       2023-10-23 10:03:19 +08:00
    公网环境下,通信要做的就是断线自动重连,而不是一个连接用到老
    stinkytofu
        3
    stinkytofu  
       2023-10-23 10:07:59 +08:00
    也可以找一个成熟的库, 库内部维护连接, 就不用操那么心了
    skcy
        4
    skcy  
       2023-10-23 11:02:13 +08:00
    如果是浏览器 tab 在非激活状态,或者电脑休眠的时候,浏览器内定时器 会触发 任务 延时机制,可尝试 webworker (休眠依然无解)
    nothingistrue
        5
    nothingistrue  
       2023-10-23 11:14:22 +08:00
    EOFException 是异常到达流尾部,这不一定是连接被断开了,你可能更需要关注 IO 流的生命周期,或者缓冲区的配置。

    至于心跳,它更应该当作被断开的感知器,不应该作为连接维持的保证器。
    gkinxin
        6
    gkinxin  
       2023-10-23 11:51:55 +08:00
    @stinkytofu 有什么库推荐一下呢
    stinkytofu
        7
    stinkytofu  
       2023-10-23 11:55:50 +08:00
    @gkinxin #6 EMQX
    Parva
        8
    Parva  
       2023-10-23 11:58:25 +08:00
    裸 websocket 手撸心跳?找些库、协议套一套吧
    coyove
        9
    coyove  
       2023-10-23 12:07:35 +08:00
    如果是浏览器的话,tab 切换,进入后台,safari 节能模式,都可能导致 websocket 不可用。这样的策略是无法预知的,只能做好重连
    mmdsun
        10
    mmdsun  
       2023-10-23 12:41:18 +08:00 via iPhone
    这是原生 websocket 吗?
    我用 spring +STOM 很稳,spring 也推荐了客户端
    https://docs.spring.io/spring-framework/reference/web/websocket/stomp.html
    0xsui
        11
    0xsui  
       2023-10-23 12:43:03 +08:00 via Android
    建议你用 SocketIO ,比自己写的更完善,更稳定
    looveh
        12
    looveh  
    OP
       2023-10-23 19:43:30 +08:00
    @coderxy 前后端都有做数据流动,防止断线。但是有时候还是会有这种错误,而我们现在有个需求走这里,并且还需要送达率 100%
    looveh
        13
    looveh  
    OP
       2023-10-23 19:43:58 +08:00
    @opengs 有重连的哦,但是断开那瞬间如果有消息通过就丢了,我们的业务是消息需要 100%到达
    looveh
        14
    looveh  
    OP
       2023-10-23 19:44:33 +08:00
    @mmdsun 后面可能会改,现在就是要满足现有需求
    looveh
        15
    looveh  
    OP
       2023-10-23 19:45:26 +08:00
    @mmdsun 不过这个我看了一下,看不太明白太菜了
    looveh
        16
    looveh  
    OP
       2023-10-23 19:46:04 +08:00
    @coyove 重连是有做的
    coderxy
        17
    coderxy  
       2023-10-23 20:02:33 +08:00
    @looveh 很正常,应该中间有很多环节都有可能把你的连接断掉, 要保证送达,该做的是离线消息。
    looveh
        18
    looveh  
    OP
       2023-10-24 10:02:52 +08:00
    @coderxy 离线消息怎么做
    coderxy
        19
    coderxy  
       2023-10-24 10:38:01 +08:00
    @looveh 消息发送时入库,接收方断线重连时获取离线消息
    looveh
        20
    looveh  
    OP
       2023-10-24 11:08:26 +08:00
    @coderxy 我们这个消息实时性很高的必须实时推到
    coderxy     21
    coderxy  
       2023-10-24 11:22:56 +08:00
    @looveh 实时性非常高就不应该用 tcp , 可以学游戏用 udp ,只要网络不是太废都能近实时送达。
    looveh
        22
    looveh  
    OP
       2023-10-24 13:07:30 +08:00
    @coderxy 其实是这个服务已经存在了,刚好有这样的业务,并且刚好有这样一个推送的服务,所以就直接用上了。目前正在考虑使用 stomp 替换
    looveh
        23
    looveh  
    OP
       2023-10-26 16:28:42 +08:00
    @mmdsun 大佬。用 stomp 的时候我发现每次订阅都是自动生成新的 Queue ,然后用我的订阅地址做 routingkey 关联。这样的话是不是意味着我如果有 1w 个用户(用户登录订阅)同时登录,就会在 mq 生成 1w 个队列?这怎么扛得住呢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3323 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 10:42 PVG 18:42 LAX 03:42 JFK 06:42
    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