準備完了を待つ

リクエストを送信する前にサーバーの準備が完了するまでRPCを待機させる方法について説明します。

準備完了を待つ

リクエストを送信する前にサーバーの準備が完了するまでRPCを待機させる方法について説明します。

概要

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

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

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

準備完了を待つ方法

スタブで「準備完了を待つ」を使用するかどうかを指定できます。これは、RPCが作成されたときに自動的に渡されます。

クライアントがサーバーにメッセージを送信したときに発生するイベントのシーケンスを、チャネルの状態と「準備完了を待つ」の設定に基づいて以下に示します。

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の例