パブリッシュ障害は、通常、クライアント側のボトルネック(サービス CPU の不足、スレッドの状態不良、ネットワークの輻輳など)が原因で発生します。パブリッシャーの再試行ポリシーでは、Pub/Sub がメッセージの配信を試行する回数と、各試行間の間隔を定義します。
このドキュメントでは、トピックにパブリッシュされたメッセージでの再試行リクエストの使用について説明します。
準備
パブリッシュ ワークフローを構成する前に、次のタスクを完了していることを確認してください。
- トピックとパブリッシュのワークフローについて学びます。
- トピックを作成します。
必要なロール
トピックへのメッセージ リクエストを再試行するために必要な権限を取得するには、トピックに対する Pub/Sub パブリッシャー(roles/pubsub.publisher
)の IAM ロールを付与するよう管理者に依頼してください。ロールの付与の詳細については、アクセスの管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
トピックとサブスクリプションを作成または更新するには、追加の権限が必要です。
再試行リクエストについて
再試行の設定では、Pub/Sub クライアント ライブラリがパブリッシュ リクエストを再試行する方法を制御できます。クライアント ライブラリには、次の再試行設定があります。
- 初期リクエストのタイムアウト: クライアント ライブラリが最初のパブリッシュ リクエスト完了の待機を停止するまでの時間。
- 再試行遅延: リクエストがタイムアウトしてからクライアント ライブラリがリクエストの再試行を待機する時間。
- 合計タイムアウト: クライアント ライブラリがパブリッシュ リクエストの再試行を停止してからの時間。
パブリッシュ リクエストを再試行するには、初期リクエスト タイムアウトが合計タイムアウトよりも短い必要があります。たとえば、指数バックオフを使用している場合、クライアント ライブラリは次のようにリクエスト タイムアウトと再試行遅延を計算します。
- 各パブリッシュ リクエストの後に、リクエスト タイムアウトは、最大リクエスト タイムアウトまでリクエスト タイムアウトの乗数で増加します。
- 再試行のたびに、再試行の遅延が最大再試行遅延まで再試行遅延の乗数で増加します。
メッセージ リクエストの再試行
公開処理中に、一時的または永続的な公開エラーが発生することがあります。一時的なエラーの場合、通常は Pub/Sub がメッセージを自動的に再試行するため、特別な操作を行う必要はありません。
パブリッシュ オペレーションが成功したものの、パブリッシャー クライアントでパブリッシュ レスポンスが時間内に受信されなかった場合にも、エラーが発生することがあります。この場合も、パブリッシュ オペレーションが再試行されます。その結果、メッセージ ID が異なる 2 つの同一のメッセージを作成できます。
永続的なエラーが発生した場合は、Pub/Sub の過負荷を避けるために、パブリッシュ プロセスの外部で適切なアクションを実装することを検討してください。
公開に失敗した場合、再試行を妨げるエラーが発生しない限り自動的にリクエストが再試行されます。このサンプルコードは、再試行設定をカスタマイズしたパブリッシャーを作成しています(クライアント ライブラリによっては、再試行設定のカスタマイズがサポートされない場合があります。選択した言語の API リファレンス ドキュメントをご覧ください)。
C++
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C++ の設定手順を実施してください。詳細については、Pub/Sub C++ API のリファレンス ドキュメントをご覧ください。
C#
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、Pub/Sub C# API のリファレンス ドキュメントをご覧ください。
Go
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Go の設定手順を実施してください。詳細については、Pub/Sub Go API のリファレンス ドキュメントをご覧ください。
Java
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、Pub/Sub Java API のリファレンス ドキュメントをご覧ください。
Node.js
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Node.js の設定手順を実施してください。詳細については、Pub/Sub Node.js API のリファレンス ドキュメントをご覧ください。
Node.js
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Node.js の設定手順を実施してください。詳細については、Pub/Sub Node.js API のリファレンス ドキュメントをご覧ください。
Python
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Python の設定手順を実施してください。詳細については、Pub/Sub Python API のリファレンス ドキュメントをご覧ください。
順序指定キーを使用してリクエストを再試行する
パブリッシャー クライアントが 1 つあるとします。Pub/Sub クライアント ライブラリを使用して、同じ順序指定キー A のメッセージ 1、2、3 をパブリッシュしています。ここで、RPC の期限が切れる前に、メッセージ 1 のパブリッシュされたレスポンスをパブリッシャー クライアントで受信していないとします。メッセージ 1 は再パブリッシュする必要があります。メッセージ 1 が正常に完了した後にのみメッセージ 2 がパブリッシュされると、サブスクライバー クライアントが受信するメッセージのシーケンスは 1、1、2、3 になります。パブリッシュされたメッセージにはそれぞれ独自のメッセージ ID があります。サブスクライバー クライアントの観点からは、4 つのメッセージがパブリッシュされ、最初の 2 つのメッセージは同一のコンテンツになっています。
順序指定キーを使用したパブリッシュ リクエストの再試行は、バッチ設定でも複雑になる場合があります。クライアント ライブラリは、メッセージをバッチ処理して、パブリッシュの効率を高めます。前の例を続け、メッセージ 1 とメッセージ 2 が一緒にバッチ化されると仮定します。このバッチは、単一のリクエストとしてサーバーに送信されます。サーバーが時間内にレスポンスを返せなかった場合、パブリッシャー クライアントはこの 2 つのメッセージのバッチを再試行します。したがって、サブスクライバー クライアントはメッセージ 1、2、1、2、3 を受信する可能性があります。Pub/Sub クライアント ライブラリを使用してメッセージを順番にパブリッシュし、パブリッシュ オペレーションが失敗した場合、同じ順序指定キーの残りのメッセージすべてに対するパブリッシュ オペレーションに失敗します。パブリッシャー クライアントは次のいずれかのオペレーションを行うことができます。
失敗したすべてのメッセージを順番に再公開します
失敗したメッセージのサブセットを順番に再公開します
新しいメッセージ セットを公開する
再試行不可能なエラーが発生すると、クライアント ライブラリはメッセージをパブリッシュせず、同じ順序指定キーが含まれる他のメッセージのパブリッシュを停止します。たとえば、存在しないトピックにパブリッシャーがメッセージを送信すると、再試行不可能なエラーが発生します。同じ順序指定キーが含まれるメッセージのパブリッシュを続行するには、パブリッシュを再開するためのメソッドを呼び出してから、パブリッシュをもう一度開始してください。
次のサンプルは、同じ順序指定キーを使用してメッセージのパブリッシュを再開する方法を示しています。
C++
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C++ の設定手順を実施してください。詳細については、Pub/Sub C++ API のリファレンス ドキュメントをご覧ください。
C#
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、Pub/Sub C# API のリファレンス ドキュメントをご覧ください。
Go
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Go の設定手順を実施してください。詳細については、Pub/Sub Go API のリファレンス ドキュメントをご覧ください。
Java
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、Pub/Sub Java API のリファレンス ドキュメントをご覧ください。
Node.js
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Node.js の設定手順を実施してください。詳細については、Pub/Sub Node.js API のリファレンス ドキュメントをご覧ください。
Python
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Python の設定手順を実施してください。詳細については、Pub/Sub Python API のリファレンス ドキュメントをご覧ください。
Ruby
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Ruby の設定手順を実施してください。詳細については、Pub/Sub Ruby API のリファレンス ドキュメントをご覧ください。
次のステップ
詳細なパブリッシュのオプションを構成する方法については、以下をご覧ください。