最近遇到的问题是:websocket在本地运行得好好的,一到线上,每次不到一分钟就自动断开了。

经过排查,发现有一些网络设备有自己的最长无响应观察期,如果超出了时间就会主动中断链接。

比如:

Nginx 配置中的proxy_read_timeout,默认是60s

许多 VPN 网关或企业级防火墙为了节省服务器资源,会设置一个极其严格的 Idle Timeout(空闲超时),通常正好也是 60秒

所以,websocket最久25s ~ 30s需要发送一次心跳。

为啥是25s ~ 30s?

我的项目设置的是60s心跳一次,结果还没等到心跳消息,链接就自动断开了。

后来又改成40s心跳一次,没有60s关闭了,结果1.5min又自动断开了。

经过分析,是因为网络有意外延迟,导致40s的心跳到达网关时已经超过60秒了。为了防止这种情况发生,最好设置 心跳间隔 <=  网关观察期/2,保证观察期内最少有一次心跳,最多有两次心跳。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐