パブリッシュ障害は、通常、クライアント側のボトルネック(サービス 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 をパブリッシュします。ここで、メッセージ 1 の公開済みレスポンスが RPC の期限切れ前にパブリッシャー クライアントによって受信されなかったとします。メッセージ 1 を再パブリッシュする必要があります。メッセージ 2 がメッセージ 1 の完了後にのみパブリッシュされると仮定すると、サブスクライバー クライアントが受信するメッセージのシーケンスは 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 リファレンス ドキュメントをご覧ください。
次のステップ
詳細なパブリッシュのオプションを構成する方法については、以下をご覧ください。