パブリッシュ障害は、通常、クライアント側のボトルネック(サービス CPU の不足、スレッドの状態不良、ネットワークの輻輳など)が原因で発生します。パブリッシャーの再試行ポリシーでは、Pub/Sub がメッセージの配信を試行する回数と、各試行間の間隔を定義します。
このドキュメントでは、トピックにパブリッシュされたメッセージで再試行リクエストを使用する方法について説明します。
準備
パブリッシュ ワークフローを構成する前に、次のタスクを完了していることを確認してください。
- トピックとパブリッシュのワークフローについて学びます。
- トピックを作成します。
必要なロール
トピックへのメッセージ リクエストを再試行するために必要な権限を取得するには、トピックに対する Pub/Sub パブリッシャー (roles/pubsub.publisher
)の IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
トピックとサブスクリプションを作成または更新するには、追加の権限が必要です。
リクエストの再試行について
再試行の設定では、Pub/Sub クライアント ライブラリがパブリッシュ リクエストを再試行する方法を制御できます。クライアント ライブラリには、次の再試行設定があります。
- 初期リクエストのタイムアウト: クライアント ライブラリが最初のパブリッシュ リクエスト完了の待機を停止するまでの時間。
- 再試行遅延: リクエストがタイムアウトしてからクライアント ライブラリがリクエストの再試行を待機する時間。
- 合計タイムアウト: クライアント ライブラリがパブリッシュ リクエストの再試行を停止してからの時間。
パブリッシュ リクエストを再試行するには、初期リクエスト タイムアウトが合計タイムアウトよりも短い必要があります。たとえば、指数バックオフを使用している場合、クライアント ライブラリは次のようにリクエスト タイムアウトと再試行遅延を計算します。
- 各パブリッシュ リクエストの後に、リクエスト タイムアウトは、最大リクエスト タイムアウトまでリクエスト タイムアウトの乗数で増加します。
- 再試行のたびに、再試行の遅延が最大再試行遅延まで再試行遅延の乗数で増加します。
メッセージ リクエストを再試行する
パブリッシュ プロセス中に、一時的なパブリッシュ エラーまたは永続的なパブリッシュ エラーが表示されることがあります。一時的なエラーの場合、Pub/Sub がメッセージを自動的に再試行するため、通常は特別な操作は必要ありません。
パブリッシュ オペレーションが成功しても、パブリッシャー クライアントがパブリッシュ レスポンスを時間内に受信しなかった場合にも、エラーが発生することがあります。この場合も、公開オペレーションは再試行されます。その結果、同じメッセージでもメッセージ ID が異なる場合があります。
エラーが解決しない場合は、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 を再公開する必要があります。メッセージ 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 リファレンス ドキュメントをご覧ください。
次のステップ
詳細なパブリッシュのオプションを構成する方法については、以下をご覧ください。