根據快照或時間戳記還原狀態,重新傳送 Pub/Sub 中的訊息

您確認訊息後,Pub/Sub 就無法擷取這些訊息。不過,有時您可能需要重播已確認的訊息,例如您執行錯誤的確認作業。接著,您可以使用Seek 功能,將先前已確認的訊息標示為未確認,並強制 Pub/Sub 重新傳送這些訊息。您也可以使用 seek 刪除未確認的訊息,方法是將訊息狀態變更為已確認。

搜尋快照時間戳記,重播訂閱項目中的訊息。本指南提供範例,說明如何使用 seek 重播先前已確認的 Pub/Sub 訊息。


如要直接在 Google Cloud 控制台按照逐步指南操作,請按一下「Guide me」(逐步引導)

逐步引導


事前準備

  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. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  5. To initialize the gcloud CLI, run the following command:

    gcloud init
  6. 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.

  7. Install the Google Cloud CLI.

  8. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  9. To initialize the gcloud CLI, run the following command:

    gcloud init

使用 gcloud 指令列介面

使用 gcloud 最簡單的方法是在 Cloud Shell 中使用。您也可以使用 Google Cloud CLI 隨附的指令列工具。如果您建立全新的 Compute Engine 機器執行個體,且其存取權範圍涵蓋所有 Cloud API 和預設 Debian 映像檔,則表示您已滿足 gcloud CLI 所需的各項設定條件。最簡單的方法是透過 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

您現在可以發佈、提取及確認訊息:

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

請注意,後續的提取程序不會產生任何新訊息 (可能會暫時產生一些重複訊息):

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

您可以尋找訂閱的快照來復原訊息。請注意,訊息可能不會立即傳送:Pub/Sub 不保證訊息傳送延遲時間。不過可以確定的是,保留在快照中的訊息最終至少會傳送一次:

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 拉取內容時,現在會產生在建立 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

您現在可以發佈、提取及確認訊息:

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

下一個提取程序應該不會傳回任何訊息:

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 主題日期時間

後續的提取程序應該會再次產生訊息:

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 秒) 後,系統就不會再傳送訊息。如需確認,您可以重複執行不會確認訊息的提取指令:

gcloud pubsub subscriptions pull seek-demo-sub

使用 Cloud 控制台

您可以在 Cloud 控制台的訂閱詳細資料頁面中建立快照,或尋找現有的快照。如要瞭解快照命名規則,請參閱「資源名稱」。

建立快照

  1. 在 Google Cloud 控制台中,前往「Pub/Sub subscriptions」(Pub/Sub 訂閱項目)頁面。

    前往訂閱項目頁面

  2. 從清單中選取訂閱項目。

  3. 按一下 [Create snapshot] (建立快照)。

  4. 輸入快照 ID,然後按一下「Create」儲存。

您可以前往 Google Cloud 控制台的「快照」頁面查看快照。您也可以在個別主題的詳細資料頁面中管理快照。

重播訂閱項目

您可以透過「Replay messages」對話方塊,跳轉至過去的時間點或已儲存的快照。如要開啟對話方塊,請按照下列步驟操作:

  1. 在 Google Cloud 控制台中,前往「Pub/Sub subscriptions」(Pub/Sub 訂閱項目)頁面。

    前往訂閱項目頁面

  2. 從清單中選取訂閱項目。

  3. 按一下「重播訊息」

  4. 在「Seek」下方,選取「To a previous time point」或「To a snapshot」,然後選取要跳轉的時間點或快照。

  5. 按一下「Seek」即可重播訊息。

還順利嗎?

請注意,Pub/Sub 支援頁面提供其他資源及連結。

後續步驟

請參閱「重播與捨棄訊息」。