キープアライブ

gRPC で HTTP/2 PING ベースの keepalive を使用する方法。

キープアライブ

gRPC で HTTP/2 PING ベースの keepalive を使用する方法。

概要

HTTP/2 PING ベースの keepalive は、データが転送されていない場合でも HTTP/2 接続を維持するための方法です。これは、PING フレーム を定期的に接続の相手方に送信することによって行われます。HTTP/2 keepalive は HTTP/2 接続のパフォーマンスと信頼性を向上させることができますが、keepalive 間隔を慎重に設定することが重要です。

背景

TCP keepalive は、接続を維持し、壊れた接続を検出するためのよく知られた方法です。TCP keepalive が有効になっている場合、接続のどちらの側でも冗長なパケットを送信できます。相手方によって ACK されると、接続は良好と見なされます。複数回の試行後に ACK が受信されない場合、接続は壊れていると見なされます。

TCP keepalive とは異なり、gRPC は HTTP/2 を使用しており、これは必須の PING フレーム を提供します。これは、往復時間、帯域幅-遅延積を推定したり、接続をテストしたりするために使用できます。TCP keepalive の間隔とリトライは PING には完全には適用されません。なぜなら、トランスポートは信頼性があるため、gRPC PING ベースの keepalive 実装ではタイムアウト(間隔 * リトライに相当)に置き換えられています。

keepalive の設定がコールにどのように影響するか

Keepalive は、応答が速い単項 RPC ではトリガーされにくいです。Keepalive は主に、keepalive チェックが失敗して接続が閉じられた場合に失敗する、長期間続く RPC でトリガーされます。

ストリーミング RPC の場合、接続が閉じられると、進行中の RPC はすべて失敗します。呼び出しがデータをストリーミングしている場合、ストリームも閉じられ、まだ送信されていないデータは失われます。

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++ ドキュメント
GoGo 例Go ドキュメント
JavaJava 例Java ドキュメント
PythonPython 例Python ドキュメント

追加リソース