Gateway监听多个端口时,[心跳检测间隔]只有一个有效?

kenny534
// 初始化 gateway 进程
$gateway = new Gateway("p1://0.0.0.0:1227")// 心跳间隔
$gateway->pingInterval = 180;
$gateway->pingNotResponseLimit = 2;// 初始化 gateway 进程
$gateway2 = new Gateway("p2://0.0.0.0:1228")// 心跳间隔
$gateway2->pingInterval = 120;
$gateway2->pingNotResponseLimit = 2;

开启了两个gateway 分别在1227 (心跳间隔180)与 1228(心跳间隔120) 两个端口监听不同的协议。
现象:gateway 只发一次心跳给客户端,最后断开了连接(距离连接成功14分钟,距离客户端发来的心跳数据9分钟)
 gateway2 能正常给客户端发心跳,但是心跳间隔是在180秒,而不是120秒
提问:gateway 与 gateway2是否可以分别设置不同的心跳间隔?以及pingNotResponseLimit ?

3142 4 0
4个回答

walkor 打赏

每个gateway的心跳间隔是分离的。
 
手册有讲心跳间隔最好不要大于60秒。原因是很多路由节点会清理60秒内不活跃的连接,导致还没来得及发送心跳,连接就断开了。
gateway 只发一次心跳给客户端,最后断开了连接就是因为这个原因断开。
 

gateway2 能正常给客户端发心跳,但是心跳间隔是在180秒,而不是120秒。

这部分手册也有讲。当设置为服务端主动发送心跳时,如果客户端最近有发来数据,那么证明客户端存活,服务端会省略一个心跳,下个心跳大约1.5*$gateway->pingInterval秒后发送。

  • lin枫520 2019-10-26

    我设置3秒发一次心跳 有问题吗?

kenny534

首先,感谢walker百忙之中的回复!
关于gateway的心跳间隔是分离的,还是有点疑问:(上述例子放在本地运行)
后创建的gateway2的心跳间隔仍然是按照先创建的gateway所设置的心跳间隔来执行的。由于是本地测试,可以忽略路由节点清理60秒内不活跃连接的因素。使用的版本是workerman 3.5.22  / gateway 3.0.13
其次,补充说明一下:上述例子的断开原因已经找到:是客户端逻辑造成的,不是服务器的原因,现在修改客户端之后,已经不会断开了
 

  • 暂无评论
walkor 打赏

还是上面手册说的,如果客户端有向服务端发送数据,服务端会省略一个心跳,下一个心跳会在1.5$gateway->pingInterval发送。
gateway2服务端定时向客户端发送心跳,如果客户端回应心跳向服务端发送了数据,服务端会省略一个心跳,下个心跳在1.5
$gateway->pingInterval秒发送,如此反复。
 
你可以把gateway的心跳设置成30秒,gateway2不变,看下gateway2是否变成30。
 

  • 暂无评论
kenny534

按您的提示,已经把gateway的心跳设置成30秒,gateway2保持120不变,实测结果发现如下:
         一、gateway如您所说会向客户端以 1.5 $gateway->pingInterval 的间隔 发送心跳
         二、gateway2的心跳仍然固定在180秒一次,始终保持不变(虽然我设置的是120秒)
问题:1、gateway使用的是自定义协议,客户端向服务器发心跳包的情况,与您所说一致。但为什么gateway2却例外?
         2、gateway2的客户端在收到心跳包之后,立即向服务器发了一个心跳包(与gateway2->pingData一致),但却不能像自定义协议那样出现1.5
$gateway->pingInterval 的时间间隔,这不是不websocket协议写死了的?gateway2使用的是websocket协议

  • walkor 2019-10-26

    gateway2客户端回复心跳,时间间隔是120*1.5=180,这个符合预期吧

  • kenny534 2019-10-27

    嗯,这个符合,但是,还是.... 哈哈,总是遇到新问题:(内网测试,不考虑路由节点的60秒断开因素)
    gateway 的心跳改回180,pingNotResponseLimit = 2,客户端主动定时(240秒)发心跳给服务器。同时,如果收到服务器的心跳也立即发一个心跳给服务器。基于此,在服务器端记录收到客户端的心跳时间表如下:
    2019-10-27 10:15:44] 客户端连接成功时主动发回心跳
    2019-10-27 10:16:08] 客户端被动发心跳(收到服务器心跳后立即发心跳给服务器)
    2019-10-27 10:16:13] 客户端被动发心跳
    2019-10-27 10:16:24] 客户端被动发心跳
    2019-10-27 10:17:03] 客户端被动发心跳
    2019-10-27 10:17:11] 客户端被动发心跳
    2019-10-27 10:17:25] 客户端被动发心跳
    2019-10-27 10:17:29] 客户端被动发心跳
    2019-10-27 10:19:13] 客户端被动发心跳
    2019-10-27 10:19:42] 客户端被动发心跳
    2019-10-27 10:19:44] 客户端【主动】发心跳
    2019-10-27 10:20:08] 客户端被动发心跳
    2019-10-27 10:20:13] 客户端被动发心跳
    2019-10-27 10:20:24] 客户端被动发心跳
    2019-10-27 10:21:03] 客户端被动发心跳
    2019-10-27 10:21:11] 客户端被动发心跳
    2019-10-27 10:21:25] 客户端被动发心跳
    2019-10-27 10:21:29] 客户端被动发心跳
    2019-10-27 10:23:13] 客户端被动发心跳
    2019-10-27 10:23:42] 客户端被动发心跳
    2019-10-27 10:23:44] 客户端【主动】发心跳
    2019-10-27 10:24:08] 客户端被动发心跳
    2019-10-27 10:24:13] 客户端被动发心跳
    2019-10-27 10:24:24] 客户端被动发心跳
    2019-10-27 10:25:03] 客户端被动发心跳
    2019-10-27 10:25:11] 客户端被动发心跳
    2019-10-27 10:25:25] 客户端被动发心跳
    2019-10-27 10:25:29] 客户端被动发心跳
    2019-10-27 10:27:13] 客户端被动发心跳
    2019-10-27 10:27:42] 客户端被动发心跳
    2019-10-27 10:27:44] 客户端【主动】发心跳
    2019-10-27 10:28:08] 客户端被动发心跳
    上述gateway的心跳日志,好像又跟gateway2的心跳日志(180秒一次)的不太一样,还请指教...

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