キープアライブ
gRPC で HTTP/2 PING ベースの keepalive を使用する方法。
キープアライブ
概要
HTTP/2 PING ベースの keepalive は、データが転送されていない場合でも HTTP/2 接続を維持するための方法です。これは、PING フレーム を定期的に接続の相手方に送信することによって行われます。HTTP/2 keepalive は HTTP/2 接続のパフォーマンスと信頼性を向上させることができますが、keepalive 間隔を慎重に設定することが重要です。
注記
関連するが別個の懸念として [Health Checking] があります。Health checking は、サーバーがサービスが正常であるかどうかを通知することを許可しますが、keepalive は接続のみに関するものです。背景
TCP keepalive は、接続を維持し、壊れた接続を検出するためのよく知られた方法です。TCP keepalive が有効になっている場合、接続のどちらの側でも冗長なパケットを送信できます。相手方によって ACK されると、接続は良好と見なされます。複数回の試行後に ACK が受信されない場合、接続は壊れていると見なされます。
TCP keepalive とは異なり、gRPC は HTTP/2 を使用しており、これは必須の PING フレーム を提供します。これは、往復時間、帯域幅-遅延積を推定したり、接続をテストしたりするために使用できます。TCP keepalive の間隔とリトライは PING には完全には適用されません。なぜなら、トランスポートは信頼性があるため、gRPC PING ベースの keepalive 実装ではタイムアウト(間隔 * リトライに相当)に置き換えられています。
注記
サービスオーナーが keepalive をサポートする必要はありません。クライアント作成者は、特定のクライアント側設定が許容可能かどうかについて、サービスオーナーと調整する必要があります。サービスオーナーは、keepalive を受信すること自体を含む、サポートする意思があることを決定します(サービスが keepalive をサポートしない場合、最初の数回の keepalive ping は無視され、サーバーは最終的に `GOAWAY` メッセージを、デバッグデータとして `too_many_pings` の ASCII コードで送信します)。keepalive の設定がコールにどのように影響するか
Keepalive は、応答が速い単項 RPC ではトリガーされにくいです。Keepalive は主に、keepalive チェックが失敗して接続が閉じられた場合に失敗する、長期間続く RPC でトリガーされます。
ストリーミング RPC の場合、接続が閉じられると、進行中の RPC はすべて失敗します。呼び出しがデータをストリーミングしている場合、ストリームも閉じられ、まだ送信されていないデータは失われます。
警告
DDoS 攻撃を回避するために、keepalive 設定を行う際には注意が必要です。したがって、呼び出しなしで keepalive を有効にすることを避け、クライアントが keepalive を 1 分未満に設定することを避けることが推奨されます。keepalive が役立つ一般的な状況
gRPC HTTP/2 keepalive は、以下を含むがこれらに限定されない、さまざまな状況で役立ちます。
- プロキシまたはロードバランサーによってアイドル状態と見なされる可能性のある、長期間続く接続でデータを送信する場合。
- ネットワークが信頼性の低い場合(例:モバイルアプリケーション)。
- 長期間の非アクティブ期間後に接続を使用する場合。
Keepalive 設定仕様
| オプション | 利用可能性 | 説明 | クライアントデフォルト | サーバーデフォルト |
|---|---|---|---|---|
KEEPALIVE_TIME | クライアントとサーバー | PING フレーム間の間隔(ミリ秒)。 | INT_MAX (無効) | 7200000 (2 時間) |
KEEPALIVE_TIMEOUT | クライアントとサーバー | PING フレームが確認されるまでのタイムアウト(ミリ秒)。この時間内に送信者が確認応答を受信しない場合、接続は閉じられます。 | 20000 (20 秒) | 20000 (20 秒) |
KEEPALIVE_WITHOUT_CALLS | クライアント | 未処理のストリームがない場合に、クライアントから keepalive ping を送信することが許可されるかどうか。 | 0 (false) | 該当なし |
PERMIT_KEEPALIVE_WITHOUT_CALLS | サーバー | 未処理のストリームがない場合に、クライアントから keepalive ping を送信することが許可されるかどうか。 | 該当なし | 0 (false) |
PERMIT_KEEPALIVE_TIME | サーバー | サーバーがデータ/ヘッダーフレームを送信せずに連続した ping フレームを受信する間の最小許容時間。 | 該当なし | 300000 (5 分) |
MAX_CONNECTION_IDLE | サーバー | チャネルに未処理の RPC がない最大時間。その後、サーバーは接続を閉じます。 | 該当なし | INT_MAX (無限) |
MAX_CONNECTION_AGE | サーバー | チャネルが存在できる最大時間。 | 該当なし | INT_MAX (無限) |
MAX_CONNECTION_AGE_GRACE | サーバー | チャネルが最大年齢に達した後の猶予期間。 | 該当なし | INT_MAX (無限) |
注記
一部の言語では追加のオプションが提供される場合があります。詳細については、言語の例と追加リソースを参照してください。言語ガイドと例
| 言語 | 例 | ドキュメント |
|---|---|---|
| C++ | C++ 例 | C++ ドキュメント |
| Go | Go 例 | Go ドキュメント |
| Java | Java 例 | Java ドキュメント |
| Python | Python 例 | Python ドキュメント |