使用 seek 重播及清除訊息

在 Pub/Sub 中確認訊息後,訂閱端用戶端就無法再存取這些訊息。此外,訂閱端必須處理訂閱項目中的每則訊息,即使只需要部分訊息也一樣。

跳轉功能可讓您大量變更訊息的確認狀態,進而擴充訂閱者功能。舉例來說,您可以重播先前確認過的訊息,或大量清除訊息。此外,您也可以搭配使用搜尋和快照,將某個訂閱項目的確認狀態複製到其他訂閱項目。

如要快速瞭解這些功能的運作方式,請參閱「根據快照或時間戳記還原狀態,重新傳送 Pub/Sub 訊息」。

快照和還原作業總覽

Pub/Sub 快照是兼具持久性、一致性和可靠度的檢視畫面,會顯示訂閱項目在特定時間點的訊息確認狀態。快照會記錄建立當下,訂閱項目中所有訊息的確認狀態。快照會保留建立時來源訂閱項目的未確認訊息,以及快照建立後發布至主題的任何訊息。

快照的生命週期取決於來源訂閱項目的現有待處理工作。生命週期等於 7 天減去訂閱項目中最舊未確認訊息的存在時間。舉例來說,假設訂閱項目快照包含待處理工作,且最舊的未確認訊息已存在 1 天,快照會在 6 天後失效。時間軸是快照提供強大的「至少傳送一次」保證的必要條件。

快照的生命週期最長為七天。 您無法建立快照,因為快照會在建立後 1 小時內到期。

透過搜尋功能,您可以搜尋訂閱項目的特定快照或時間戳記。這項功能可讓您控管 Pub/Sub 如何從特定時間點或特定快照傳送訊息。

如要搜尋過去時間並重播先前確認過的訊息,您必須在主題中設定訊息保留功能,或將訂閱項目設為保留已確認的訊息。如要瞭解詳情,請參考下列資源:

搜尋作業的最終一致性

就訊息傳送保證而言,搜尋作業嚴格一致。也就是說,根據搜尋條件而變成未確認的訊息,保證會在搜尋作業成功後最終送達。不過,傳送的訊息不會立即與搜尋作業保持一致。因此,在搜尋時間戳記之前發布的訊息,或是在快照中確認的訊息,可能會在搜尋作業後傳送。就搜尋作業而言,訊息傳遞作業可視為最終一致的系統;這項作業可能需要一分鐘才能完全生效。

搜尋作業的用途

  • 安全地更新訂閱者代碼。部署新訂閱者程式碼時,新可執行檔可能會錯誤地確認訊息,導致訊息遺失。將快照納入部署程序,有助於從新訂閱者程式碼中的錯誤復原。
  • 解決訂閱者遇到的非預期問題。如果訂閱者問題與特定部署事件無關,您可能沒有相關的快照。在這種情況下,如果您已為訂閱項目啟用已確認訊息保留功能,只要搜尋過去的時間,即可從錯誤中復原。
  • 節省處理時間和成本。對大量不再相關的訊息積壓工作執行大量確認作業。
  • 在已知資料上測試訂閱者程式碼。測試訂閱者程式碼的效能和一致性時,每次執行都使用相同資料會很有幫助。快照可確保資料一致性,並提供強大的語意。此外,快照可以套用至指定主題的任何訂閱項目,包括新建立的項目。

建立快照

您可以使用控制台、Google API 或 Google Cloud CLI 建立快照。

控制台

如要建立快照,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「快照」頁面。

    前往快照頁面

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

  3. 在「選取 Pub/Sub 訂閱項目」部分,選取訂閱項目。

  4. 在「Snapshot ID」(快照 ID) 中輸入快照的名稱。

    如要進一步瞭解如何命名 Pub/Sub 資源,請參閱主題、訂閱項目、結構定義或快照的命名規範

  5. 按一下 [Create] (建立) 以建立快照。

您也可以從「訂閱項目」頁面建立快照。如果您在建立訂閱項目後立即建立快照,可能會因為新建立訂閱項目的傳播延遲而發生錯誤。

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 CLI 搜尋時間戳記。如要搜尋訂閱項目中的時間戳記,請先確認訂閱項目已啟用訊息保留功能。

控制台

如要跳到特定時間戳記,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Subscription」(訂閱) 頁面。

    前往「訂閱」頁面

  2. 按一下已啟用訊息保留功能的訂閱項目。

  3. 在訂閱詳細資料頁面中,按一下「重播訊息」

  4. 在「Seek」部分,按一下「To a previous time point」

  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 CLI 搜尋快照。

控制台

如要跳至特定時間點,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Subscription」(訂閱) 頁面。

    前往「訂閱」頁面

  2. 按一下訂閱方案。

  3. 在訂閱詳細資料頁面中,按一下「重播訊息」

  4. 按一下「Seek」(搜尋),然後按一下「To a snapshot」(快照)

  5. 選取適當的快照,然後按一下「Seek」(搜尋)

gcloud

如要搜尋快照,請使用下列 gcloud pubsub subscriptions seek 指令:

gcloud pubsub subscriptions seek SUBSCRIPTION_ID \
    --snapshot=SNAPSHOT_ID

更改下列內容:

  • SNAPSHOT_ID:快照的 ID。 快照的主題必須與訂閱項目相同。
  • SUBSCRIPTION_ID:訂閱 ID。

使用篩選器搜尋

你可以使用篩選器重播訂閱項目中的訊息。如果使用設有篩選器的訂閱項目,並依時間戳記搜尋,Pub/Sub 服務只會重新傳送符合篩選條件的訊息。

含有篩選條件的訂閱項目快照包含下列訊息:

  • 快照建立後的所有訊息,包括與篩選器不符的訊息。
  • 早於快照的未確認訊息。

如果您使用設有篩選器的訂閱項目搜尋快照,Pub/Sub 服務只會重新傳送快照中符合訂閱項目篩選條件的訊息,並發出搜尋要求。

如要進一步瞭解篩選器,請參閱「篩選訊息」。

使用無效信件主題搜尋

如果您在設有 dead-letter 主題的訂閱項目中搜尋訊息,Pub/Sub 會將傳送嘗試次數設為 0。您從這些訂閱項目收到的郵件會顯示遞送嘗試次數。

如要進一步瞭解 dead-letter 主題,請參閱「轉送至 dead-letter 主題」。

使用重試政策搜尋

如果您在設有重試政策的訂閱項目中搜尋訊息,Pub/Sub 會重設下列項目之間的延遲:

  1. 確認期限到期,或訂閱端傳送否定確認。
  2. Pub/Sub 重新傳送訊息。

如要進一步瞭解重試政策,請參閱「使用重試政策」。

使用「僅傳送一次」功能搜尋

如果您在「只傳送一次」的訂閱項目中搜尋訊息,Pub/Sub 會重新傳送先前確認過且符合傳送資格的訊息。如果是在搜尋作業前傳送,任何確認都會失敗。搜尋作業具有最終一致性

如要進一步瞭解重試政策,請參閱僅傳送一次