swoole如何维持TCP长连接状态,及链接失效问题

第一种方式:
调整系统内核参数,/proc/sys/net/ipv4/tcp_fin_timeout
缺点:有兼容性,不够灵活

第二种方式:

配置tcp_keepidle,进行服务端检测连接状态,

 1 $serv = new Swoole\Server("192.168.2.194", 6666, SWOOLE_PROCESS);
 2 $serv->set(array(
 3     'worker_num' => 1,
 4     'open_tcp_keepalive' => 1,
 5     'tcp_keepidle' => 4, //4s没有数据传输就进行检测
 6     'tcp_keepinterval' => 1, //1s探测一次
 7     'tcp_keepcount' => 5, //探测的次数,超过5次后还没回包close此连接
 8 ));
 9 
10 $serv->on('connect', function ($serv, $fd) {
11     var_dump("Client:Connect $fd");
12 });
13 
14 $serv->on('receive', function ($serv, $fd, $reactor_id, $data) {
15     var_dump($data);
16 });
17 
18 $serv->on('close', function ($serv, $fd) {
19   var_dump("close fd $fd");
20 });
21 
22 $serv->start();

或者使用心跳检测

array(
    'heartbeat_idle_time'      => 600, // 表示一个连接如果600秒内未向服务器发送任何数据,此连接将被强制关闭
    'heartbeat_check_interval' => 60,  // 表示每60秒遍历一次
);


缺点:需要客户端配合,复杂度适中

 

第三种方式:

应用层keepidle,
客户端定时发送ping包,然后服务端回复pong包(mysql状态,redis状态,相关Rpc服务状态)

posted @ 2020-10-23 16:02  sea24  阅读(909)  评论(0)    收藏  举报