スナップショットまたはタイムスタンプまでシークして Pub/Sub でメッセージを再生する

確認応答した後は、Pub/Sub はメッセージを取得できません。ただし、確認応答のエラーが発生した場合など、確認応答済みメッセージを再生する必要が生じる場合があります。次に、シーク機能を使用して、確認応答済みのメッセージを未確認としてマークし、Pub/Sub にそれらのメッセージの再配信を強制できます。シークを使用して確認応答されていないメッセージを削除することもできます。この場合、ステータスを「確認応答済み」に変更します。

スナップショットまでシークするか、タイムスタンプまでシークしてサブスクリプション内のメッセージを再生してください。このガイドでは、シークを使用して確認応答済みの Pub/Sub メッセージを再生する例を紹介します。


このタスクを Google Cloud コンソールで直接行う際の順を追ったガイダンスについては、「ガイドを表示」をクリックしてください。

ガイドを表示


始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Set up a Google Cloud console project.

    Set up a project

    Click to:

    • Create or select a project.
    • Enable the Pub/Sub API for that project.

    You can view and manage these resources at any time in the Google Cloud console.

  3. Install the Google Cloud CLI.
  4. To initialize the gcloud CLI, run the following command:

    gcloud init
  5. Set up a Google Cloud console project.

    Set up a project

    Click to:

    • Create or select a project.
    • Enable the Pub/Sub API for that project.

    You can view and manage these resources at any time in the Google Cloud console.

  6. Install the Google Cloud CLI.
  7. To initialize the gcloud CLI, run the following command:

    gcloud init

gcloud コマンドライン インターフェースの使用

gcloud を使用する最も簡単な方法は Cloud Shell です。Google Cloud CLI に付属するコマンドライン ツールを使用することもできます。 gcloud CLI の設定要件は、Compute Engine マシンのインスタンスを新規作成するときにアクセス スコープにすべての Cloud API とデフォルトの Debian イメージを含めれば、自動的に満たされます。これを作成するには Compute Engine の UI を使うのが最も簡単です。以降の説明では、これらのコマンドライン ツールのどれかを使用するものと仮定します。

gcloud の詳しい使い方は、gcloud のクイックスタートをご覧ください。gcloud リファレンスgcloud pubsub セクションも参照してください。Pub/Sub gcloud のコマンドの完全なリストが掲載されています。

スナップショットを作成してシークする

トピックとサブスクリプションを作成します。インタラクティビティを高めるため、確認応答期限を短く設定します。

gcloud pubsub topics create seek-demo-topic
gcloud pubsub subscriptions create seek-demo-sub --topic=seek-demo-topic --ack-deadline=10

今のところ、サブスクリプション内に確認済みのメッセージはありません。この状態を取得するためにスナップショットを作成します。

gcloud pubsub snapshots create my-snapshot --subscription=seek-demo-sub
gcloud pubsub snapshots list

メッセージを公開し、pull し、確認します。

gcloud pubsub topics publish seek-demo-topic --message 'hello, world'
gcloud pubsub subscriptions pull --auto-ack seek-demo-sub

なお、以降の pull でメッセージは生成されません(一時的な複製はあり得る)。

gcloud pubsub subscriptions pull --auto-ack seek-demo-sub

メッセージを回復するには、サブスクリプションをスナップショットまでシークします。メッセージがすぐに配信されない可能性があることにご注意ください。Pub/Sub はメッセージの配信のレイテンシを保証していません。ただし、スナップショットに保持されているメッセージは最終的に少なくとも 1 回は確実に配信されます。

gcloud pubsub subscriptions seek seek-demo-sub --snapshot=my-snapshot
gcloud pubsub subscriptions pull seek-demo-sub --auto-ack

なお、サブスクリプションのトピックがスナップショットのトピックと同じであれば、他のサブスクリプションを同じスナップショットまでシークしてもかまいません。

gcloud pubsub subscriptions create seek-demo-sub2 --topic=seek-demo-topic --ack-deadline=10
gcloud pubsub subscriptions seek seek-demo-sub2 --snapshot=my-snapshot

seek-demo-sub2 から pull 操作を行うと、seek-demo-sub2 の作成以前にパブリッシュされたメッセージが生成されます。

gcloud pubsub subscriptions pull seek-demo-sub2 --auto-ack

使い終わったスナップショットをクリーンアップします。

gcloud pubsub snapshots delete my-snapshot

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

確認応答済みのメッセージを再生する別の方法があります。特定のタイムスタンプまでシークするという方法です。特定のタイムスタンプまでシークするには、確認応答済みのメッセージが retain-acked-messages に基づいて保持されるように最初にサブスクリプションを構成する必要があります。retain-acked-messages が設定されている場合、Pub/Sub は確認済みメッセージを 7 日間保持します。

このステップが必要になるのは、スナップショットではなくタイムスタンプまでシークする場合だけです。

gcloud pubsub subscriptions update seek-demo-sub --retain-acked-messages

メッセージを公開し、pull し、確認します。

gcloud pubsub topics publish seek-demo-topic --message 'hello, world'
gcloud pubsub subscriptions pull --auto-ack seek-demo-sub

次の pull でメッセージは返されないはずです。

gcloud pubsub subscriptions pull seek-demo-sub

さて、以前の時刻までシークしてメッセージを回復しましょう。GNU 版と BSD(MacOS)版で date コマンドの日付演算フラグが異なることにご注意ください。

export TS_FORMAT=%Y-%m-%dT%H:%M:%SZ
gcloud pubsub subscriptions seek seek-demo-sub --time=$(date -u -d '-10 min' +$TS_FORMAT)

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

その後の pull でメッセージは再度生成されます。

gcloud pubsub subscriptions pull --auto-ack seek-demo-sub

ある時点(現在の時刻など)より以前に公開されたすべてのメッセージの配信をシークでスキップすることもできます。具体的には、サブスクリプションを現在の時刻までシークして過去のすべてのメッセージを「確認済み」とマークします。

gcloud pubsub topics publish seek-demo-topic --message 'hello, world'
gcloud pubsub subscriptions seek seek-demo-sub --time=$(date -u +$TS_FORMAT)

伝播に要する遅延時間(60 秒ほど)が経過すると、メッセージは配信されなくなります。これを確認するには、pull コマンドを何回か実行し、その都度、メッセージへの確認応答を返さないようにします。

gcloud pubsub subscriptions pull seek-demo-sub

Cloud コンソールの使用

Cloud Console のサブスクリプションに関する詳細ページで、スナップショットの作成や既存のスナップショットへのシークを行うことができます。スナップショットの命名規則については、リソース名を参照してください。

スナップショットの作成

  1. Google Cloud コンソールで、[Pub/Sub サブスクリプション] ページに移動します。

    [サブスクリプション] ページに移動

  2. リストからサブスクリプションを選択します。

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

  4. スナップショットの ID を入力し、[作成] をクリックして保存します。

スナップショットは、Google Cloud コンソールの [スナップショット] ページで確認できます。各トピックの詳細ページでスナップショットを管理することもできます。

サブスクリプションの再生

[メッセージの再生] ダイアログでは、前の時点または保存されたスナップショットまでシークできます。ダイアログを開くには:

  1. Google Cloud コンソールで、[Pub/Sub サブスクリプション] ページに移動します。

    [サブスクリプション] ページに移動

  2. リストからサブスクリプションを選択します。

  3. [メッセージを再生] をクリックします。

  4. [シーク] で [前の時点まで] または [スナップショットまで] のいずれかを選択し、シークする時点またはスナップショットを選択します。

  5. [シーク] をクリックしてメッセージを再生します。

いかがでしたか

Pub/Sub のサポートページにその他の参考資料やリンクがありますので、こちらもご利用ください。

次のステップ

メッセージの再生と破棄をご覧ください。