出典: Swoole のハートビートに関するブラザー・トンの記事, 実は原理がよくわかりませんが、LANではハートビートが必要なのでしょうか?
—————————————————————————————————————————— ———————————————————
Swoole は多くの友人が混乱しているハートビート機能を提供します。
心拍とは何ですか?
ハートビートはその名の通り、物事が生きているか死んでいるかを判断する基準であり、swooleではハートビートを使って接続が正常か切断されているかを判断します。
TCP プロトコルから始める
接続を確立するには 3 つのハンドシェイクがあり、接続を切断するには 4 つのウェーブがあることは誰もが知っています。接続の終了を開始するのがサーバーであっても、クライアント
であっても、このようにしてシステムはこの fd を完全にリサイクルし、アプリケーション層もリサイクルすることができます。 onClose コールバックを通じて関連事項を処理します。
fd とは何ですか?
fd の学名はファイル記述子であり、すべてはファイルであるという Unix の哲学では、この fd は 5 タプルのネットワーク接続を表すためにシステム層によってビジネス層に公開される識別子です。この fd を操作することで、システム層が対応する接続を見つけて、ネットワーク瞳孔にデータを送信したり、接続を閉じるなどの一連の操作を実行できるようになります。
心臓はなぜ鼓動するのですか?
先ほど述べたように、接続を閉じたい場合は、swoole を例として、ビジネス層の fd で接続を閉じる操作を開始できます。 >close($ fd);
通常の状況では、4 つのウェーブはすべて完了し (swoole には onClose コールバックがあります)、システムは fd をリサイクルして他の接続に割り当てます。
では、なぜシステムは fd をリサイクルするのでしょうか? fd リソースには限りがあるため、再利用する必要があるからです。
しかし、蘭翔訓練中に突然ネットワークケーブルが抜かれたり、光ケーブルが掘り出された場合など、サーバーはこの接続の異常を感知できず、実際には接続に失敗している場合があります。リサイクル メカニズム。このタイプの接続ではすべての fd が使い果たされ、システムが新しい接続リクエストを受け付けなくなるため、ハートビート メカニズムが存在します。
心拍の仕組みとは何ですか?
ハートビート メカニズムは、接続が生きているかどうかを判断するためにビジネス層によって提供される方法であり、システムが接続が失敗したかどうかを判断できるようになります。一般に 2 つの実装方法があります。
1: クライアントは定期的にハートビート パケットを送信して、サーバーがまだ生きていることを伝えます。サーバーは、すべてのクライアントのリストを定期的にチェックして、最後のハートビートの時刻を確認します。パケットが長すぎる場合は、ハートビートがないと見なされ、接続が切断されていると判断され、接続がアクティブに閉じられます。
2: サーバーは定期的にすべてのクライアントに「まだ生きていますか?」と尋ねます。生きているならフィードバックをください。フィードバックを受け取らないクライアントは容赦なく殺されます。
2 つのハートビート ソリューションの違いは何ですか?
最初のオプションはサーバーとネットワークへの負担が少なく、より柔軟ですが、クライアントがハートビート パケットの定期的な送信に協力する必要があります。
2 番目のオプションはサーバーとネットワークへの負担が大きくなるため、お勧めできません。
swoole でのハートビートの実装
swoole は最初の解決策を採用します
swoole はメインプロセスで独立してハートビートスレッドを開始し、すべての接続を定期的にポーリングして、寿命と接続が切断されるため、swoole のハートビートはビジネス ロジックをブロックしません。
では、接続が生きているか死んでいるかをどのように判断するのでしょうか? Swoole には接続構造に time_t last_time フィールドがあり、これは最後に受信したパケットのタイムスタンプを保存し、それを今回の時刻と比較してパケットが生きているかどうかを判断するために使用されます
したがって、swoole には 2 つの構成があります。
heartbeat_check_interval: サーバーがオンライン リストを定期的にチェックする時間
heartbeat_idle_time: 接続の最大アイドル時間 (最後のハートビート パケットの時刻と現在の時刻の差が を超える場合)この値の場合、接続は無効とみなされます)
構成の推奨事項
heartbeat_idle_time は、heartbeat_check_interval の 2 倍より少し大きい値にすることをお勧めします。
この 2 倍は耐障害性を目的としており、1 つのパケットが失われることを許容します。
ネットワーク遅延を考慮するため、より多くの値が使用されます。
このフォールト トレランス レート (どの程度のパケット損失を許容するか) は、実際のビジネスに応じて調整できます。
補足
1. システムレベルでもハートビートメカニズムが提供されますが、粒度は比較的粗く、時間はアプリケーション層ほど柔軟ではありません。 🎜>2. swoole は ping 機能も提供しており、ping 値を設定することで、swoole カーネルはそれが単なるハートビート パケットであると判断でき、データ パケットをアプリケーション層 (onReceive) に転送する必要はありません。
3. ハートビートは swoole に固有のものではありません。ほとんどの TCP ネットワーク サービスはこの問題を考慮します