最近在实践 websocket 时,你会发现建立起的连接会莫名其妙自动关闭了,同时发现一些开源项目中,比如 stompjs 以及 socket.io,通常都会维护一个心跳机制,那这是为什么呢?
为什么会关闭
一直想找一个官方关于 websocket 自动关闭的原因。网上各种说法都有,有 60s 被关闭的,也有 90s 的,找了很久好像并没有官方的说法,导致找到了关于 nginx 相关的说法。
nginx 作为轻量级代理服务器,已然是企业级的标配。
那为什么客户端和服务端建立连接后,如果在 60s 时间内没有数据交互,连接就会自动断开。这个 60s 怎么来的呢。其实是由于 nginx 的如下参数决定的
proxy_read_timeout: 60s;
为了避免连接被断开,我们可以把这个值改大一些。
心跳机制
你会发现,无论我把值改多大,如果超过这个值还是会导致断开。这时候就需要一个心跳机制。一定时间内发送心跳包,会刷新再读时间
有了心跳机制,我们可以在 onerror 事件中,进行自动重连