待機して準備完了
リクエストを送信する前にサーバーが準備完了になるまで待機するようにRPCを構成する方法を説明します。
待機して準備完了
リクエストを送信する前にサーバーが準備完了になるまで待機するようにRPCを構成する方法を説明します。
概要
これは、スタブで使用できる機能であり、リクエストを送信する前にサーバーが利用可能になるまでRPCが待機するようになります。これにより、一時的なサーバーの問題が失敗を引き起こさないため、堅牢なバッチワークフローが可能になります。デッドラインは引き続き適用されるため、デッドラインを超過すると待機は中断されます。
サーバーへの接続に失敗したときにRPCが作成された場合、Wait-for-Ready を使用しないとすぐに失敗が返されます。Wait-for-Ready を使用すると、接続が準備完了になるまでキューに入れられます。デフォルトは Wait-for-Ready を**使用しない**ことです。
詳細なセマンティクスについては、こちら を参照してください。
Wait-for-Ready の使用方法
スタブで使用するかどうかを Wait-for-Ready で指定でき、これは RPC が作成されるときに自動的に渡されます。
注記
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ハンドラーを実装することと組み合わせることができます(これをサポートする言語の場合)。
- 効率化のために、これは
- すぐに失敗させたいので、待機によって回避できた可能性のある失敗を受け入れます。
言語サポート
| 言語 | 例 |
|---|---|
| Java | Javaの例 |
| Go | Goの例 |
| Python | Pythonの例 |
最終更新日: 2023年8月22日: fix: Wait-for-Ready ドキュメントページの Go サンプルURLエラー (#1179) (007035b)