websocket为什么一分钟就自己断开了
·
最近遇到的问题是:websocket在本地运行得好好的,一到线上,每次不到一分钟就自动断开了。
经过排查,发现有一些网络设备有自己的最长无响应观察期,如果超出了时间就会主动中断链接。
比如:
Nginx 配置中的proxy_read_timeout,默认是60s
许多 VPN 网关或企业级防火墙为了节省服务器资源,会设置一个极其严格的 Idle Timeout(空闲超时),通常正好也是 60秒。
所以,websocket最久25s ~ 30s需要发送一次心跳。
为啥是25s ~ 30s?
我的项目设置的是60s心跳一次,结果还没等到心跳消息,链接就自动断开了。
后来又改成40s心跳一次,没有60s关闭了,结果1.5min又自动断开了。
经过分析,是因为网络有意外延迟,导致40s的心跳到达网关时已经超过60秒了。为了防止这种情况发生,最好设置 心跳间隔 <= 网关观察期/2,保证观察期内最少有一次心跳,最多有两次心跳。

更多推荐




所有评论(0)