swoole websocket启用心跳检测有几率断开连接

2022年8月18日 306点热度 0人点赞 0条评论
 
点击上方“技术爱”关注我们



问题背景

使用swoole4.8版本 作为websocket服务端

nginx代理swoole服务


问题复现

开启websocket服务

heartbeat_check_interval 设置为60

heartbeat_idle_time 不设置

题外话:heartbeat_check_interval表示每隔多久轮循一次,单位为秒,如果该连接在 120 秒内(heartbeat_idle_time 未设置时默认为 interval 的两倍),没有向服务器发送任何数据,此连接将被强制关闭。若未配置,则不会启用心跳,该配置默认关闭。

Server 并不会主动向客户端发送心跳包,而是被动等待客户端发送心跳。服务器端的 heartbeat_check 仅仅是检测连接上一次发送数据的时间,如果超过限制,将切断连接。

被心跳检测切断的连接依然会触发 onClose 事件回调


测试发现在有心跳设置的情况下有几率被关闭连接       图片         


问题原因

排查发现,nginx设置反向代理时,设置了keepalive_timeout = 60(没有60秒接收到任何数据,则主动断开,如果在60内有数据传输,则从最后一次数据传输完毕后,重置计时时间和proxy_read_timeout = 60(连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理,也可以说是后端服务器处理请求的时间),和心跳检测的时间一样,有几率导致close

此外还有proxy_send_timeout也需要注意(后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据)

解决方案

图片               

81850swoole websocket启用心跳检测有几率断开连接

这个人很懒,什么都没留下

文章评论