待機して準備完了

リクエストを送信する前にサーバーが準備完了になるまで待機するようにRPCを構成する方法を説明します。

待機して準備完了

リクエストを送信する前にサーバーが準備完了になるまで待機するようにRPCを構成する方法を説明します。

概要

これは、スタブで使用できる機能であり、リクエストを送信する前にサーバーが利用可能になるまでRPCが待機するようになります。これにより、一時的なサーバーの問題が失敗を引き起こさないため、堅牢なバッチワークフローが可能になります。デッドラインは引き続き適用されるため、デッドラインを超過すると待機は中断されます。

サーバーへの接続に失敗したときにRPCが作成された場合、Wait-for-Ready を使用しないとすぐに失敗が返されます。Wait-for-Ready を使用すると、接続が準備完了になるまでキューに入れられます。デフォルトは Wait-for-Ready を**使用しない**ことです。

詳細なセマンティクスについては、こちら を参照してください。

Wait-for-Ready の使用方法

スタブで使用するかどうかを Wait-for-Ready で指定でき、これは RPC が作成されるときに自動的に渡されます。

以下は、チャネルの状態と Wait-for-Ready の設定の有無に基づいて、クライアントがサーバーにメッセージを送信するときに発生するイベントのシーケンスを示しています。

sequenceDiagram
participant A as Application
participant RPC
participant CH as Channel
participant S as Server 
A->>RPC: Create RPC using stub
RPC->>CH: Initiate Communication
alt channel state: READY
  CH->>S: Send message
else Channel state: IDLE or CONNECTING
  CH-->>CH: Wait for state change
else Channel state: TRANSIENT_FAILURE
  alt with Wait-for-Ready
    CH-->>CH: Wait for channel<br>becoming READY<br>(or a permanent failure)
    CH->>S: Send message
  else without Wait-for-Ready
    CH->>A: Failure
  end
else Channel state is a Permanent Failure
    CH->>A: Failure
end

以下は、状態ベースのビューです。

stateDiagram-v2
   state "Initiating Communication" as IC
   state "Channel State" as CS
   IC-->CS: Check Channel State
   state CS {
      state "Permanent Failure" as PF
      state "TRANSIENT_FAILURE" as TF
      IDLE --> CONNECTING
      CONNECTING --> READY
      READY-->[*]
      CONNECTING-->TF
      CONNECTING-->PF
      TF-->READY
      TF -->[*]: without\n wait-for-ready
      TF-->PF
      PF-->[*]
   }
  state "MSG sent" as MS
  state "RPC Failed" as RF
  CS-->WAIT:From IDLE /\nCONNECTING
  CS-->WAIT:From Transient\nFailure with\nWait-for-Ready
  WAIT-->CS:State Change 
  CS-->MS: From READY
  CS-->RF: From Permanent failure or\nTransient Failure without\nWait-for-Ready
  MS-->[*]
  RF-->[*]

代替手段

  • RPC が一時的な失敗を返さなくなるまで、ループ(指数バックオフ付き)します。
    • 効率化のために、これは onReady ハンドラーを実装することと組み合わせることができます(これをサポートする言語の場合)。
  • すぐに失敗させたいので、待機によって回避できた可能性のある失敗を受け入れます。

言語サポート

言語
JavaJavaの例
GoGoの例
PythonPythonの例