リクエストを再試行する

パブリッシュ障害は、通常、クライアント側のボトルネック(サービス CPU の不足、スレッドの状態不良、ネットワークの輻輳など)が原因で発生します。パブリッシャーの再試行ポリシーでは、Pub/Sub がメッセージの配信を試行する回数と、各試行間の間隔を定義します。

このドキュメントでは、トピックにパブリッシュされたメッセージで再試行リクエストを使用する方法について説明します。

準備

パブリッシュ ワークフローを構成する前に、次のタスクを完了していることを確認してください。

必要なロール

トピックへのメッセージ リクエストを再試行するために必要な権限を取得するには、トピックに対する Pub/Sub パブリッシャー roles/pubsub.publisher)の IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織に対するアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

トピックとサブスクリプションを作成または更新するには、追加の権限が必要です。

再試行リクエストについて

再試行の設定では、Pub/Sub クライアント ライブラリがパブリッシュ リクエストを再試行する方法を制御できます。クライアント ライブラリには、次の再試行設定があります。

  • 初期リクエストのタイムアウト: クライアント ライブラリが最初のパブリッシュ リクエスト完了の待機を停止するまでの時間。
  • 再試行遅延: リクエストがタイムアウトしてからクライアント ライブラリがリクエストの再試行を待機する時間。
  • 合計タイムアウト: クライアント ライブラリがパブリッシュ リクエストの再試行を停止してからの時間。

パブリッシュ リクエストを再試行するには、初期リクエスト タイムアウトが合計タイムアウトよりも短い必要があります。たとえば、指数バックオフを使用している場合、クライアント ライブラリは次のようにリクエスト タイムアウトと再試行遅延を計算します。

  • 各パブリッシュ リクエストの後に、リクエスト タイムアウトは、最大リクエスト タイムアウトまでリクエスト タイムアウトの乗数で増加します。
  • 再試行のたびに、再試行の遅延が最大再試行遅延まで再試行遅延の乗数で増加します。

メッセージ リクエストを再試行する

公開プロセス中に、一時的な公開エラーまたは永続的な公開エラーが発生することがあります。一時的なエラーの場合、通常は特別な操作を行う必要はありません。Pub/Sub がメッセージを自動的に再試行するためです。

パブリッシュ オペレーションは成功したものの、パブリッシュ レスポンスがパブリッシャー クライアントに時間内に届かなかった場合にも、エラーが発生することがあります。この場合も、パブリッシュ オペレーションは再試行されます。その結果、メッセージ ID が異なる同じメッセージが 2 つ存在することになります。

エラーが継続的に発生する場合は、Pub/Sub に過負荷がかからないように、パブリッシュ プロセスの外部で適切なアクションを実装することを検討してください。

パブリッシュに失敗した場合、再試行を保証しないエラーが発生しない限り、自動的にリクエストが再試行されます。このサンプルコードは、再試行設定をカスタマイズしたパブリッシャーを作成しています(クライアント ライブラリによっては、再試行設定のカスタマイズがサポートされない場合があります。選択した言語の API リファレンス ドキュメントをご覧ください)。

C++

このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C++ の設定手順を実施してください。詳細については、Pub/Sub C++ API リファレンス ドキュメントをご覧ください。