メッセージの再生と消去

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

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

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

メッセージ保持の構成

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

トピックのメッセージ保持

デフォルトでは、Pub/Sub トピックは、そのトピックに関連付けられたすべてのサブスクリプションによって確認応答された時点でメッセージを破棄します。トピックにメッセージ保持を構成すれば、トピックに関連付けられたサブスクリプションが過去に遡ってシークし、前に確認応答済みのメッセージを再生できるようになります。トピックのメッセージ保持を使用すると、サブスクリプションが作成される前に公開されたメッセージを再生することもできます。

トピックのメッセージ保持が有効になっている場合、トピックが保持するメッセージのストレージ料金はトピックのプロジェクトに課金されます。

Console

メッセージ保持を有効にしたトピックを作成する方法は次のとおりです。

  1. Cloud Console で、[Pub/Sub トピック] ページに移動します。

    [トピック] ページに移動

  2. [トピックを作成] をクリックします。

  3. [トピック ID] に、トピックの ID を入力します。

  4. [メッセージの保持期間を設定] チェックボックスをオンにします。他のオプションはデフォルト設定のままにします。

  5. [メッセージ保持期間] の下にあるプルダウン メニューを使用して、メッセージを保持する日数、時間、分を選択します。

  6. [トピックを作成] をクリックしてトピックを保存します。

トピックのメッセージ保持設定を更新するには:

  1. [Pub/Sub トピック] ページからトピックを選択します。

    [トピック] ページに移動

  2. トピックの詳細ページの上部にある [編集] をクリックします。

  3. 保持期間を調整したり、メッセージの保持を有効または無効にするには、[メッセージ保持を有効にする] チェックボックスをオンまたはオフにします。

  4. [更新] をクリックして、トピックへの変更を保存します。

gcloud

メッセージ保持期間が 7 日間のトピックを作成するには、次の gcloud pubsub topics create コマンドを使用します。

gcloud pubsub topics create TOPIC_ID --message-retention-duration=7d

この設定は gcloud pubsub topics update を使用して更新できます。 これにより、既存のトピックのメッセージ保持も有効にできます。

gcloud pubsub topics update TOPIC_ID --message-retention-duration=1d

update コマンドを使用して、トピックのメッセージ保持を無効にすることもできます。

gcloud pubsub topics update TOPIC_ID --clear-message-retention-duration

サブスクリプションのメッセージ保持

デフォルトでは、サブスクリプションは確認応答されるとすぐにメッセージを破棄します。未確認メッセージは、デフォルトで 7 日間保持されます(サブスクリプションの message_retention_duration プロパティで構成できます)。確認済みのメッセージが retain_acked_messages プロパティを介して保持されるようにサブスクリプションを構成すると、サブスクリプションに送信された確認済みのメッセージを再生できます。 サブスクリプション内のメッセージは、確認済みであるかどうかにかかわらず、最大 7 日間保持できます。つまり、サブスクリプション内の最も古いメッセージの経過時間は 7 日以内です。

サブスクリプションが確認応答済みメッセージを保持するように構成されている場合、サブスクリプションによって保持される確認応答済みメッセージのストレージ費用はサブスクリプションのプロジェクトに課金されます。

Console

確認応答済みメッセージの保持を有効にしてサブスクリプションを作成する手順は次のとおりです。

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

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

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

  3. [サブスクリプション ID] フィールドにサブスクリプションの ID を入力します。

  4. [メッセージ保持期間] の下にあるプルダウン メニューを使用して、メッセージを保持する日数、時間、分を選択します。

  5. [確認応答済みメッセージを保持する] チェックボックスをオンにします。他のオプションはデフォルト設定のままにします。

  6. [サブスクリプションを作成] をクリックしてサブスクリプションを保存します。

サブスクリプションのメッセージ保持設定を更新するには:

  1. [Pub/Sub サブスクリプション] ページからサブスクリプションを選択します。

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

  2. サブスクリプションの詳細ページの上部にある [編集] をクリックします。

  3. メッセージの保持期間を調整するか、[確認済みメッセージを保持] というラベルが付いたチェックボックスをオンまたはオフにして、確認応答済みのメッセージの保持を有効または無効します。

  4. [更新] をクリックして、サブスクリプションへの変更を保存します。

gcloud

確認済みメッセージの保持を有効にしてサブスクリプションを作成するには、次の gcloud pubsub subscriptions create コマンドを使用します。

gcloud pubsub subscriptions create SUBSCRIPTION_ID
    --retain_acked_messages=true
    --message-retention-duration=5d

この設定は gcloud pubsub subscriptions update を使用して更新できます。 これにより、既存のサブスクリプションの確認応答済みメッセージの保持も有効にできます。

gcloud pubsub subscriptions update SUBSCRIPTION_ID --message-retention-duration=1d

update コマンドを使用して、サブスクリプションの確認応答済みメッセージの保持を無効にすることもできます。

gcloud pubsub subscriptions update SUBSCRIPTION_ID --retain_acked_messages=false

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

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

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

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

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

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

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

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

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

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

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

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

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

結果整合性

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

フィルタでのシーク

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

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

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

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

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

デッドレター トピックでのシーク

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

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

再試行ポリシーでのシーク

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

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

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

ユースケース

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

次のステップ

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