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

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

跳轉至快照或時間戳記,重播訂閱項目中的訊息。本指南提供範例,說明如何使用「還原至先前的狀態」功能,重播先前已確認的 Pub/Sub 訊息。


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

「Guide me」(逐步引導)


事前準備

請先完成下列步驟,再執行管道。

設定專案

  1. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自體驗產品的實際應用成效。新客戶還能獲得價值 $300 美元的免費抵免額,能用於執行、測試及部署工作負載。
  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, if it is not already enabled.

    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, if it is not already enabled.

    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

必要的角色

如要完成本快速入門導覽課程,您需要下列 Identity and Access Management (IAM) 角色。

如要取得完成本快速入門導覽課程所需的權限,請要求管理員在專案中授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

使用 gcloud 指令列介面

使用 gcloud 最簡單的方式是透過 Cloud Shell 。 您也可以使用 Google Cloud CLI 隨附的指令列工具。如果您使用預設 Debian 映像檔建立全新的 Compute Engine 電腦執行個體,並將存取權範圍設為包含所有 Cloud API,系統就會自動滿足 gcloud CLI 的設定先決條件。最簡單的建立方式是透過 Compute Engine UI。在本文的其餘部分,我們將假設您使用其中一個指令列工具。

如要進一步瞭解如何使用 gcloud,請參閱 gcloud 快速入門導覽課程。如需 Pub/Sub gcloud 指令的完整清單,請參閱 gcloud 參考資料中的 gcloud pubsub 專區。

建立及搜尋快照

建立主題和訂閱項目。如要提升互動性,請使用較短的確認期限:

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 topic datetimes。

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

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,然後按一下「建立」儲存。

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

重新播放訂閱內容

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

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

    前往「訂閱項目」頁面

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

  3. 按一下「重播訊息」。

  4. 在「搜尋」下方,選取「至先前時間點」或「至快照」,然後選取要搜尋的時間點或快照。

  5. 按一下「Seek」(搜尋),即可重播訊息。

還順利嗎?

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

後續步驟

請參閱「重新播放及捨棄訊息」。