5.心拍数検出/心拍数パック

1740 ワード

ドキドキは何ですか?
その名の通り、心拍数は物事の生か死かを判断する基準であり、swooleでは、心拍数は接続が正常か切断かを判断するために使われる.
どうしてドキドキするの?
心拍の目的は実はクライアントが生存しているかどうかを判断することによってfdを回収することであり、システムはなぜfdを回収するのか、fd資源は限られているため、繰り返し利用しなければならない.
心拍数の作用は主に2つあります.
1、クライアントはタイミングを決めてサービス側にポイントデータを送信し、長い間通信していないため、あるノードのファイアウォールによって接続が閉鎖されて接続が切断されることを防止する.
2、サービス側は心拍数でクライアントがオンラインかどうかを判断することができ、クライアントが所定時間内にデータを送っていない場合、クライアントがオフラインであると判断する.これにより、クライアントが極端な状況(停電、ネットワーク切断など)でオフラインになったイベントを検出することができる.
ドキドキswooleでの実現:
swooleはメインプロセスに独立してハートビートスレッドを作成し、すべての接続をタイミング的にポーリングすることで、接続の生死を判断するので、swooleのハートビートはビジネスロジックを塞ぐことはありません.
//     ,      ,   2+worker_num     
$server->set([
    'worker_num'=>2,
    'heartbeat_idle_time'=>10,  //            : s
    'heartbeat_check_interval'=>3  //                 : s
]);

設定が完了すると、タイミング検出が設定されていることに気づき、クライアントが所定の時間内にデータを送信しないと閉じます.heartbeat_check_interval:サーバタイミング検出オンラインリストの時間heartbeat_idle_time:接続最大のアイドル時間(最後のハートビートパケットの時間と現在の時間の差がこの値を超えると、接続が無効になるとみなされます)
構成の推奨事項:
推奨事項heartbeat_idle_timeはheartbeat_check_intervalの2倍以上です.この2倍はフォールトトレランスを行うためで、パケットを1つ失うことを許可し、ネットワークの遅延を考慮することが多い.ここに配置した3秒は、10 sの時間が少し短いので、主にテストの便利さのために、実際の開発では長い設定ができます.
どうしてドキドキバッグが必要ですか?クライアントはどのように心拍数を維持しますか?
クライアントからサーバへの巨大なリンクの中で無数のルータを通過し、その中の各ルータは何秒以内にパケットがなければ自動的に接続を閉じるという省エネメカニズムを検出する可能性があり、この省エネメカニズムが失効する可能性があるために、クライアントはタイマーを設定することができます.一定の時間ごとにランダムな文字の1バイトのパケットを送信します.通常、このパケットを心拍パケットと呼びます.
テストコード:
ここでクライアントはheartbeat_idle_timeは10秒を配置し、最大アイドル検出された1秒前に1回要求を送信し、接続がアクティブにオフにならないことを保証します.つまり、長い接続を保証します.
//     ,     ,          ,         ,      
\Swoole\Timer::tick(9000,function() use ($client){
    $client->send('1');
});