gatewayworker心跳间隔大于60秒会触发onclose吗?

dou号

手册上说“客户端定时每X秒(推荐小于60秒)向服务端发送特定数据,服务端设定为X秒没有收到客户端心跳则认为客户端掉线,并关闭连接触发onClose回调。” 而之所以推荐小于60秒是因为“很多路由节点会清理60秒内不活跃的连接,导致还没来得及发送心跳,连接就断开了。”参考自walker大大在https://wenda.workerman.net/question/4615 这个问题中的回复。
问题一:现在我设置的$gateway->pingInterval=60;$gateway->pingNotResponseLimit = 2;即客户端连接 pingInterval*pingNotResponseLimit=120 秒内没有任何请求则服务端认为对应客户端已经掉线,服务端关闭连接并触发onClose回调。此时其时长已经大于60秒,是不是就没有意义了?我的客户端大概40秒左右会发一次心跳,我是不是应该设置成$gateway->pingInterval=40;$gateway->pingNotResponseLimit = 1才最合适?
问题二:如果是由于路由节点清理而断开的连接是否还能正确调用onclose($client_id)函数处理业务?

2278 2 0
2个回答

walkor

问题1:$gateway->pingInterval=60;$gateway->pingNotResponseLimit = 2; 最坏的情况连接断开120秒后服务端才检测到,是否有意义看你是否有依赖onClose的业务以及120秒延迟能否接受。前端心跳40秒,服务端建议设置成$gateway->pingInterval=50;$gateway->pingNotResponseLimit = 1;$gateway->pingInterval=50;设置的比40稍大一些,避免网络延迟造成误判。
问题2: 这种情况一般会有延迟,一般是心跳检测的时候才能触发

  • dou号 2019-12-25

    我需要在onClose里面更新我的设备状态,现在发现有部分设备已经断电但是状态一直没有更新,通过打印数据发现有两种可能。可能一:设备断电后触发了onClose,但是数据库更新失败,导致设备状态没有更新;可能二:设备断电后未触发onClose。
    按照您对问题一的回复,虽然我需要在onClose中更新设备,但如果我对实时性要求不是很高的话,目前这个设置也可以接受是吗?
    对于问题二,您的意思是最终还是可以触发心跳是吗?因为我在onClose里面打印未获取到$_SESSION值的client_id时,并没有发现那些已经断电但是状态并未更新的设备的client_id,而这些设备登录时client_id是存在的

walkor

手册有讲,设备断电、断网(包括路由节点)这种极端情况不会立刻触发onClose。配置为$gateway->pingInterval=60;$gateway->pingNotResponseLimit = 2; 最坏的情况连接断开120秒后服务端才能触发onClose。你对实时性不高可以使用这个配置。

路由节点清理连接也属于上述情况。心跳会检测到连接断开并触发onClose,只不过有延迟。

年代过于久远,无法发表回答
🔝