メッセージの再生と消去

Pub/Sub サブスクライバーのデータ API(pull など)は、メッセージ データへの制限付きアクセスを提供します。通常、特定のサブスクリプションのサブスクライバーから確認応答済みのメッセージにアクセスすることはできません。さらに、サブスクライバーのクライアントは、一部しか必要でなくてもサブスクリプションに含まれるメッセージをすべて処理しなければなりません。

シーク機能はサブスクライバーの機能を拡張するもので、メッセージの確認応答状態を一括で変更できます。たとえば、確認応答済みのメッセージを再生することや、メッセージをまとめて消去することができます。さらに、シーク機能の一部として導入されたスナップショットという機能とシークを組み合わせて使えば、あるサブスクリプションの状態を別のサブスクリプションにコピーすることもできます。確認応答済みのメッセージを回復するには、通常、ソース サブスクリプションを事前に構成する必要があり、そのために追加のストレージ料金が発生します。

以下、これらの機能を説明します。ただし、活用例についてはクイックスタートをご覧ください。

仕組み

特定のタイムスタンプまでシークする

ある特定の時刻までシークすると、結果的に、その時刻よりも前に Pub/Sub が受信したあらゆるメッセージが確認応答済みとしてマークされ、それよりも後に受信したあらゆるメッセージが確認応答されていないものとしてマークされます。未来のある時刻までシークするとメッセージが消去されます。確認応答済みのメッセージを再生または再処理するには、過去に遡ってシークします。メッセージのパブリッシュ時間は Pub/Sub サーバーで生成されます(API リファレンスの publishTime を参照)。このアプローチは、次の理由で正確性に欠けます。

  • Pub/Sub サーバー間に、クロックのずれがある可能性がある。

  • Pub/Sub がソースシステムでのイベント発生時刻ではなく、パブリッシュ リクエストの到着時刻で処理を行うしかない。

過去に遡ってシークするには、確認応答済みのメッセージが保持されるように、前もってサブスクリプションを構成する必要があります。

  • 確認応答済みのメッセージは、サブスクリプションの retain_acked_messages プロパティが true(デフォルトは false)に設定されている場合のみ、パブリッシュ後、最長で message_retention_duration(デフォルトでは 7 日間)サブスクリプションに保持されます。確認応答済みのメッセージは、サブスクリプションの retain_acked_messagestrue に設定された後に確認応答されたもののみが保持されます。
  • 確認応答されていないメッセージは、パブリッシュ後、最長で message_retention_duration(デフォルトでは 7 日間)サブスクリプションに保持されます。
  • サブスクリプションの retain_acked_messages プロパティと message_retention_duration プロパティは、いずれも、サブスクリプションの作成時に指定することや、既存のサブスクリプションのものを更新することができます。

特定のスナップショットまでシークする

スナップショット機能を使用すると、サブスクリプションのメッセージ確認応答状態を取得できます。スナップショットが作成されると、次のものが保持されます。

  • スナップショットが作成された時点で、ソース サブスクリプション内で確認応答されていなかったすべてのメッセージ。

  • それ以降にそのトピックにパブリッシュされたすべてのメッセージ。

これらの確認応答されていないメッセージを再生するには、スナップショットを使用して、そのトピックのいずれかのサブスクリプションまでシークします。

特定の時刻までシークする場合と異なり、特定のスナップショットまでシークするためにサブスクリプションを特別に構成する必要はありません。事前にスナップショットを作成することのみが必要です。たとえば、新しいサブスクライバー コードをデプロイするとき、予期しない確認応答や誤った確認応答からの回復が必要になった場合に備えてスナップショットを作成するようなケースが考えられます。

スナップショットは、次の場合に期限切れとなり削除されます(どちらかの条件が最初に成立したとき)。

  • スナップショットの有効期間(7 日間)が切れた。
  • スナップショット内の最も古い確認応答されていないメッセージが message retention duration を超えた。

たとえば、サブスクリプションのスナップショットにバックログがあり、確認応答されていないメッセージのうち、最も古いものが 1 日前のものだとします。この場合、スナップショットは 7 日ではなく 6 日後に期限切れになります。このタイムラインはスナップショットで at-least-once 配信を確実に保証するために必要になります。

結果整合性

メッセージ配信の保証に関してシーク オペレーションには完全な一貫性があります。つまり、シーク条件に基づいて確認応答されていないと判定されるメッセージは、シーク オペレーションの成功後に最終的に少なくとも 1 回は配信されることが保証されます。ただし、配信されるメッセージが直ちにシーク オペレーションと一致することはありません。シーク タイムスタンプよりも前にパブリッシュされたメッセージ(またはスナップショット内の確認応答済みのメッセージ)はシーク オペレーション後に配信される可能性があります。ある意味で、メッセージ配信はシーク オペレーションと最終的に一致するシステムとして動作します。オペレーションが完全に有効になるまで 1 分ほどかかることがあります。

ユースケース

  • サブスクライバー コードを安全に更新する。新しいサブスクライバー コードをデプロイするとき、新しい実行可能ファイルがメッセージに誤って確認応答し、メッセージが失われることが懸念されます。この場合、デプロイ プロセスにスナップショットを組み込むことで、新しいサブスクライバー コードのバグから回復できます。
  • 予期しないサブスクライバーの問題から回復する。サブスクライバーの問題が特定のデプロイ イベントに関係していないと、関連するスナップショットが存在しない可能性があります。この場合、サブスクリプションの確認応答済みのメッセージを保持する設定を有効化してあれば、過去の時点までシークすることでエラーから回復できます。
  • 処理時間とコストを節約する。関連性のないメッセージの大きなバックログに対して一括で確認応答を行います。
  • サブスクライバー コードを既知のデータでテストする。サブスクライバー コードをテストしてパフォーマンスや一貫性の向上を図るときは、毎回の実行で同じデータを使用すると便利です。スナップショットにより、強力なセマンティクスを伴う一貫したデータが実現します。また、スナップショットは、新しく作成されたサブスクリプションを含む、所定のトピックの任意のサブスクリプションに適用できます。

次のステップ

Pub/Sub を Dataflow で使用できます。しかし、稼働中の Dataflow パイプラインから Pub/Sub Seek に直接アクセスすることはおすすめしません。推奨ワークフローは、Dataflow での Pub/Sub の使用をご覧ください。