使用 seek 重播及清除訊息

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

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

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

快照和尋找功能總覽

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

快照的生命週期取決於來源訂閱項目的現有待處理工作。生命週期等於 7 天減去訂閱項目中最舊的未確認訊息存在時間。舉例來說,假設訂閱項目含有待處理工作,其中最舊的未確認訊息為 1 天前,快照會在 6 天後失效。快照必須遵循這個時間表,才能提供強大的至少一次傳送保證。

快照的生命週期上限為七天。您無法建立快照,讓快照在建立後 1 小時內到期。

您可以使用搜尋功能,針對訂閱項目尋找特定快照或時間戳記。這項功能可讓您控制 Pub/Sub 如何從特定時間點或特定快照中傳送訊息。

如要跳轉至過去的時間,並重播先前已確認的訊息,您必須先設定主題的訊息保留期限,或設定訂閱項目以保留已確認的訊息。

搜尋作業的最終一致性

在郵件傳送保證方面,Seek 作業會嚴格保持一致。也就是說,任何根據搜尋條件變成未確認的訊息,都保證會在搜尋作業成功後最終傳送。不過,已傳送的訊息不會立即與搜尋作業保持一致。因此,在尋找時間戳記之前發布或在快照中確認的訊息,可能會在尋找作業之後傳送。從某種意義來說,訊息傳送作業會以最終一致的系統運作,以便執行搜尋作業;作業可能需要一分鐘的時間才能完全生效。

搜尋作業的用途

  • 安全更新訂閱者程式碼。部署新訂閱者程式碼時,可能會發生新執行檔誤認訊息,導致訊息遺失。將快照納入部署程序,可讓您還原新訂閱者程式碼中的錯誤。
  • 解決訂閱者發生的非預期問題。如果訂閱者問題與特定部署事件無關,您可能就沒有相關的快照。在這種情況下,如果您已為訂閱項目啟用已確認訊息保留功能,則可以透過尋找過去的時間點來復原錯誤。
  • 節省處理時間和成本。針對大量不再相關的待處理訊息執行大量確認作業。
  • 在已知資料上測試訂閱者程式碼。在測試訂閱者程式碼的成效和一致性時,建議您每次執行時都使用相同的資料。快照可提供一致的資料,並具備強大的語意。此外,快照可套用至特定主題的任何訂閱項目,包括新建立的訂閱項目。

設定訊息保留功能

您可以設定主題的訊息保留時間,並設定所有相關訂閱項目,保留已確認的訊息。如果您希望訊息保留時間比訂閱項目設定的訊息保留時間長,建議您設定主題訊息保留時間。在這種情況下,主題專案和訂閱專案會根據各自的訊息保留設定,針對訊息儲存空間收取費用。

如果未設定主題訊息保留時間,系統會在未確認訊息的年齡超過訂閱項目的 message_retention_duration 屬性時,從訂閱項目中刪除該訊息。另一方面,如果設定主題訊息保留時間,系統只會在未確認訊息的年齡超過主題和訂閱項目 message_retention_duration 的上限時,從訂閱項目中刪除該訊息。

設定主題訊息保留時間

根據預設,Pub/Sub 主題會在所有附加至主題的訂閱項目確認訊息後立即捨棄訊息。設定保留訊息的主題可讓您享有更多彈性,讓任何連結至主題的訂閱項目都能回溯至特定時間,並重播先前已確認的訊息,直到主題的 message_retention_duration 為止。主題訊息保留功能還可讓訂閱項目重播在建立訂閱項目之前發布的訊息。

主題最多可保留已發布訊息 31 天 (可透過主題的 message_retention_duration 屬性設定),即使所有附加訂閱項目都已確認訊息,也一樣。如果主題的 message_retention_duration 大於訂閱項目的 message_retention_duration,Pub/Sub 只會在訊息年齡超過主題的 message_retention_duration 時才捨棄訊息。

如果啟用主題訊息保留功能,主題保留的訊息儲存空間費用會計入主題專案。

控制台

如要建立啟用訊息保留功能的主題,請按照下列步驟操作:

  1. 在 Google Cloud 控制台中,前往「Pub/Sub 主題」頁面。

    前往「Topics」(主題) 頁面

  2. 按一下「建立主題」

  3. 在「主題 ID」欄位中輸入主題 ID。

  4. 啟用「設定訊息保留時間」

    其他選項則保留預設設定。

  5. 使用「訊息保留期限」下拉式選單,選取訊息的保留天數、小時和分鐘數。

  6. 按一下「建立主題」,即可儲存主題。

如要更新主題的訊息保留設定,請按照下列步驟操作:

  1. 在「Pub/Sub 主題」頁面中選取主題。

    前往「Topics」(主題) 頁面

  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

設定訂閱訊息保留時間

建立訂閱項目後,Pub/Sub 就會開始代表訂閱項目保留訊息。根據預設,Pub/Sub 會在訊息確認後立即從訂閱中捨棄訊息。未確認的訊息預設保留時間為 7 天 (可透過訂閱項目的 message_retention_duration 屬性進行設定)。

設定訂閱項目以保留已確認的訊息 (使用 retain_acked_messages 屬性),即可重播訂閱項目保留的先前已確認訊息。您可以設定訊息在訂閱項目中保留的時間上限為 31 天。這項設定適用於已確認和未確認的訊息。

如果訂閱項目設為保留已確認的訊息,系統會向訂閱項目的專案收取保留的已確認訊息儲存費用。

控制台

如要建立啟用已確認訊息保留功能的訂閱項目,請按照下列步驟操作:

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

    前往訂閱項目頁面

  2. 按一下「Create Subscription」 (建立訂閱項目)

  3. 在「Subscription ID」(訂閱 ID) 欄位中輸入訂閱 ID。

  4. 使用「訊息保留期限」下拉式選單,選取訊息保留的天數、小時和分鐘數。

  5. 啟用「保留已確認的訊息」。其他選項則保留預設設定。

  6. 按一下「建立訂閱項目」,即可儲存訂閱項目。

如要更新訂閱項目的訊息保留設定,請按照下列步驟操作:

  1. Pub/Sub 訂閱項目頁面中選取訂閱項目。

    前往訂閱項目頁面

  2. 按一下訂閱詳細資料頁面頂端的「編輯」

  3. 勾選或取消勾選「Retain acknowledged messages」欄位,即可調整訊息保留時間,或啟用/停用已確認訊息的保留功能。

  4. 按一下「更新」,儲存訂閱項目的變更。

gcloud

如要建立啟用已確認訊息保留功能的訂閱項目,請使用下列 gcloud pubsub subscriptions create 指令:

gcloud pubsub subscriptions create SUBSCRIPTION_ID
    --retain-acked-messages
    --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 --no-retain-acked-messages

建立快照

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

控制台

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

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

    前往「Snapshots」(快照) 頁面

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

  3. 在「Select a Pub/Sub subscription」(選取 Pub/Sub 訂閱項目) 中,選取訂閱項目。

  4. 在「Snapshot 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. 在訂閱詳細資料頁面中,按一下「Replay messages」(重播訊息)

  4. 如要使用「Seek」功能,請按一下「To a previous time point」

  5. 選取適當的日期和時間,然後按一下「Seek」

gcloud

如要尋找時間戳記,請使用下列 gcloud pubsub subscriptions seek 指令:

gcloud pubsub subscriptions seek SUBSCRIPTION_ID \
    --time=TIME \

更改下列內容:

  • TIME:要執行尋找作業的時間。
  • SUBSCRIPTION_ID:訂閱項目 ID。

如要進一步瞭解支援的時間格式,請參閱 gcloud 主題日期時間

搜尋快照

您可以使用快照跳轉至任何主題訂閱項目,重播未確認的訊息。

與尋找時間點不同,您不需要執行任何特殊的訂閱設定,即可尋找快照。您只需要事先建立快照。舉例來說,您可以在部署新訂閱者程式碼時建立快照,以便在需要從意外或錯誤的確認中復原時使用。

如果訂閱項目的積壓工作過舊,且產生的快照會在 1 小時內到期,尋找作業就會失敗。

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

控制台

如要尋找快照,請按照下列步驟操作:

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

    前往「訂閱項目」頁面

  2. 按一下訂閱項目。

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

  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 服務只會重新傳送快照中與搜尋要求訂閱項目篩選器相符的訊息。

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

使用無效信件主題進行搜尋

如果您在含有無效信件主題的訂閱項目中尋找訊息,Pub/Sub 會將傳送嘗試次數設為 0。您透過這些訂閱項目收到的訊息,會包含一個欄位,用來計算傳送嘗試次數。

如要進一步瞭解無效信件主題,請參閱「轉寄至無效信件主題」。

使用重試政策進行搜尋

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

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

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

使用「僅傳送一次」功能進行尋找

如果您在訂閱項目中尋找訊息,且該訂閱項目只傳送一次,Pub/Sub 會重新傳送先前已確認的訊息,這些訊息符合傳送資格。針對在搜尋作業前完成的遞送作業,任何確認都會失敗。搜尋作業具有最終一致性

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