シークを使用してメッセージを再生、削除する

Pub/Sub でメッセージを確認応答すると、サブスクライバー クライアントからこれらのメッセージにアクセスできなくなります。さらに、サブスクライバーのクライアントは、一部しか必要でなくてもサブスクリプションに含まれるメッセージをすべて処理しなければなりません。

シーク 機能はサブスクライバーの機能を拡張するもので、メッセージの確認応答状態を一括で変更できます。たとえば、確認応答済みのメッセージを再生することや、メッセージをまとめて消去することができます。さらに、シークとスナップショット を組み合わせて使用することで、あるサブスクリプションの状態を別のサブスクリプションにコピーすることもできます。

これらの機能の仕組みの簡単なデモについては、 スナップショットまたはタイムスタンプまでシークして Pub/Sub でメッセージを再生するをご覧ください。

スナップショットとシークの概要

Pub/Sub スナップショットは、サブスクリプションのメッセージの確認応答(ack)状態に関する特定の時点のビューであり、耐久性、整合性、信頼性に優れています。スナップショットは、作成時のサブスクリプション内のすべてのメッセージの確認応答状態を記録します。スナップショットは、スナップショットの作成時にソース サブスクリプションで確認応答されていないメッセージと、スナップショットの作成後にトピックにパブリッシュされたメッセージを保持します。

スナップショットの存続期間は、ソース サブスクリプションの既存のバックログによって決まります。存続期間は、7 日間からサブスクリプション内の最も古い未確認メッセージの経過日数を差し引いた期間です。たとえば、サブスクリプションのスナップショットにバックログがあり、その最も古い未確認メッセージが 1 日前のメッセージだとします。スナップショットは 6 日後に期限切れになります。このタイムラインはスナップショットで at-least-once 配信を確実に保証するために必要になります。

スナップショットの最大存続期間は 7 日です。 作成後 1 時間以内に期限切れになるスナップショットは作成できません。

シーク機能を使用すると、サブスクリプションの特定のスナップショットまたはタイムスタンプまでシークできます。この機能を使用すると、Pub/Sub が特定の時点または特定のスナップショットからメッセージを配信する方法を制御できます。

過去に遡ってシークし、前に確認済みのメッセージを再生する場合は、トピックのメッセージ保持を構成するか、または確認済みのメッセージを保持するようにサブスクリプションを構成する必要があります。詳しくは以下をご覧ください。

シーク オペレーションの結果整合性

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

シーク オペレーションのユースケース

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

スナップショットの作成

スナップショットは、コンソール、Google API、Google Cloud CLI を使用して作成できます。

Console

スナップショットの作成手順は次のとおりです。

  1. コンソール Google Cloud で、[**スナップショット**] ページに移動します。

    [スナップショット] ページに移動

  2. [スナップショットを作成] をクリックします。

  3. [Pub/Sub サブスクリプションを選択] で、サブスクリプションを選択します。

  4. [スナップショット ID] には、スナップショットの名前を入力します。

    Pub/Sub リソースの名前を指定する方法の詳細については、トピック、サブスクリプション、スキーマ、スナップショットの指定方法のガイドラインをご覧ください。

  5. [作成] をクリックしてスナップショットを作成します。

スナップショットは、[サブスクリプション] ページから作成することもできます。サブスクリプションを作成した直後にスナップショットを作成すると、新しく作成されたサブスクリプションの伝播遅延によりエラーが発生する可能性があります。

gcloud

スナップショットを作成するには、次の コマンド gcloud pubsub snapshots create を使用します。

gcloud pubsub snapshots create \
    --project=PROJECT_ID \
    --subscription=SUBSCRIPTION_ID \
    SNAPSHOT_ID

以下を置き換えます。

  • PROJECT_ID: プロジェクトの ID を指定します。

  • SUBSCRIPTION_ID: サブスクリプションの ID を指定します。

  • SNAPSHOT_ID。スナップショットの ID を指定します。

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

ある特定の時刻までシークすると、結果的に、その時刻よりも前に Pub/Sub が受信したあらゆるメッセージが確認応答済みとしてマークされ、それよりも後に受信したあらゆるメッセージが確認応答されていないものとしてマークされます。

タイムスタンプに基づいて、次のタイプのシーク オペレーションを実行できます。

  • すべてのメッセージを消去するには、未来のある時刻までシークします。

  • 確認応答済みのメッセージを再生または再処理するには、過去に遡ってシークします。

メッセージのパブリッシュ時間は Pub/Sub サーバーで生成されます(API リファレンスの publishTime を参照)。このアプローチは、次の理由により不正確です。

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

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

タイムスタンプまでシークするには、コンソール、Google API、Google Cloud CLI を使用します。サブスクリプションのタイムスタンプまでシークする前に、サブスクリプションでメッセージ保持が有効になっていることを確認してください。

Console

タイムスタンプまでシークする手順は次のとおりです。

  1. コンソール Google Cloud で、[Subscription] ページに移動します。

    サブスクリプションに移動

  2. メッセージ保持が有効になっているサブスクリプションをクリックします。

  3. [サブスクリプションの詳細] ページで、[メッセージの再生] をクリックします。

  4. [**シーク**] で、[**過去の時点まで**] をクリックします。

  5. 適切な日付と時刻を選択し、[シーク] をクリックします。

gcloud

タイムスタンプまでシークするには、次の コマンド gcloud pubsub subscriptions seek を使用します。

gcloud pubsub subscriptions seek SUBSCRIPTION_ID \
    --time=TIME \

以下を置き換えます。

  • TIME: シーク オペレーションを実行する時刻。
  • SUBSCRIPTION_ID: サブスクリプションの ID。

サポートされている時刻形式の詳細については、gcloud topic datetimes をご覧ください。

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

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

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

サブスクリプションのバックログが古すぎて、結果のスナップショットが 1 時間以内に期限切れになる場合、シーク オペレーションは失敗します。

コンソール、Google API、Google Cloud CLI を使用して、スナップショットまでシークできます。

Console

スナップショットまでシークする手順は次のとおりです。

  1. コンソール Google Cloud で、[Subscription] ページに移動します。

    サブスクリプションに移動

  2. サブスクリプションをクリックします。

  3. [サブスクリプションの詳細] ページで、[メッセージの再生] をクリックします。

  4. シークするには、[スナップショットまで] をクリックします。

  5. 適切なスナップショットを選択し、[シーク] をクリックします。

gcloud

スナップショットまでシークするには、次の コマンド gcloud pubsub subscriptions seek を使用します。

gcloud pubsub subscriptions seek SUBSCRIPTION_ID \
    --snapshot=SNAPSHOT_ID

以下を置き換えます。

  • SNAPSHOT_ID: スナップショットの ID。 スナップショットのトピックは、サブスクリプションのトピックと同じである必要があります。
  • SUBSCRIPTION_ID: サブスクリプションの ID。

フィルタでシークする

フィルタを含むサブスクリプションから取得したメッセージを再生できます。フィルタを含むサブスクリプションを使用してタイムスタンプまでシークすると、Pub/Sub サービスは、フィルタに一致するメッセージのみを再配信します。

フィルタを含むサブスクリプションのスナップショットには、次のメッセージが含まれます。

  • スナップショットより新しいすべてのメッセージ(フィルタに一致しないメッセージも含む)
  • スナップショットより古い、未承認のメッセージ。

フィルタを含むサブスクリプションを使用してスナップショットまでシークした場合、Pub/Sub サービスは、シークリクエストを行ったサブスクリプションのフィルタに一致する、スナップショット内のメッセージのみを再配信します。

フィルタの詳細については、メッセージのフィルタをご覧ください。

デッドレター トピックでシークする

デッドレター トピックを含むサブスクリプションのメッセージをシークすると、Pub/Sub は配信試行を 0 に設定します。これらのサブスクリプションから受信するメッセージには、配信試行回数を集計するフィールドがあります。

デッドレター トピックの詳細については、デッドレター トピックへの転送をご覧ください。

再試行ポリシーでシークする

再試行ポリシーを含むサブスクリプション内のメッセージをシークすると、Pub/Sub によって次の場合の遅延がリセットされます。

  1. 確認応答期限が切れる、またはサブスクライバーが否定応答を送信する。
  2. Pub/Sub によるメッセージの再送信。

再試行ポリシーの詳細については、再試行ポリシーの使用をご覧ください。

1 回限りの配信でシークする

サブスクリプション内で正確に 1 回配信を行うメッセージまでシークすると、以前に確認応答済みの配信対象メッセージが Pub/Sub により再送信されます。シーク オペレーションの前に行われた配信の確認応答は失敗します。シークオペレーションは 最終的に整合します

再試行ポリシーの詳細については、 1 回限りの配信をご覧ください。