訂閱者可能會因為各種原因而無法處理訊息。舉例來說,擷取處理訊息所需資料時,可能會發生暫時性問題。或者,訊息的格式可能與訂閱者預期的不同。
本頁面說明如何使用訂閱重試政策,或將未送達的訊息轉送至死信主題 (又稱為「死信佇列」),以處理這類處理失敗問題。
請注意,Dataflow 不支援這些功能。如需進一步瞭解,請參閱 Dataflow 說明文件中的「不支援的 Pub/Sub 功能」一節。
訂閱項目重試政策
如果 Pub/Sub 嘗試傳送訊息,但訂閱端無法確認,Pub/Sub 會自動嘗試重新傳送訊息。這項重送作業稱為「訂閱重試政策」。這不是您可以開啟或關閉的功能,但可以選擇要使用的重試政策類型。
首次建立及設定訂閱時,您可以選擇使用下列重試政策之一,即立即重新提交或指數型後退。根據預設,訂閱會使用即時重新提交。
立即重新送達
根據預設,Pub/Sub 會立即嘗試重新傳送訊息 (可能會傳送至同一個訂閱者用戶端)。不過,如果導致訊息無法收到回應的情況並未改變,立即重新傳送可能會導致問題。在這種情況下,Pub/Sub 可能會重新傳送多個無法確認的訊息。
為解決即時重新傳送問題,Pub/Sub 可讓您設定指數輪詢政策。
指數輪詢
指數輪詢可讓您在重試嘗試之間增加逐漸延長的延遲時間。第一次傳送失敗後,Pub/Sub 會等待最短的輪詢時間,然後再重試。每次連續訊息傳送失敗時,延遲時間會增加,最多可達 600 秒。
最長和最短延遲間隔並非固定值,應根據應用程式的本機因素進行設定。
請注意以下指數輪詢的注意事項:
- 指數輪詢觸發條件會在下列動作中生效:
- 收到負面確認回應時。
- 訊息的確認期限到期。
- 指數回退只會套用至個別訊息,而不會套用至訂閱項目中的所有訊息 (全域)。
- 使用指數回退時,即使先前訊息收到負面確認 (除非您使用有序訊息傳遞),Pub/Sub 仍會繼續傳遞其他訊息。
使用重試政策延遲部分訊息的傳送和處理作業,以因應在傳送時無法處理某些訊息的暫時性問題。這項功能會盡力套用,且會針對每封郵件分別評估重試政策。
我們不建議您使用這項功能,刻意延遲訊息傳送時間。如果您在已設定重試政策的訂閱項目上,對大量訊息做出負面確認 (nack),則部分訊息可能會以較少或不回退的方式傳送。如果您拒絕大量訊息,Pub/Sub 也可能會減緩所有訊息的傳送速度。
如果您需要安排提交作業,請考慮使用 Cloud Tasks。
設定指數輪詢
控制台
建立新訂閱時,您可以按照下列步驟設定指數遞減重試政策:
在 Google Cloud 控制台中,前往「Pub/Sub subscriptions」(Pub/Sub 訂閱項目)頁面。
按一下「Create Subscription」 (建立訂閱項目)。
在「Subscription ID」(訂閱項目 ID) 欄位中輸入名稱。
如要瞭解如何命名訂閱項目,請參閱「命名主題或訂閱項目的規範」。
從下拉式選單中選擇或建立主題。
訂閱項目會接收主題的訊息。
選取「Delivery type」(放送類型)。
在「重試政策」下方,選取「在指數輪詢延遲時間過後重試」。
輸入介於 0 到 600 秒之間的輪詢時間下限和輪詢時間上限。
預設值為 10 秒 (輪詢持續時間下限) 和 600 秒 (輪詢持續時間上限)。
按一下 [建立]。
gcloud
如要建立採用指數回退重試政策的新訂閱項目,請搭配下列旗標執行 gcloud pubsub create
指令:
gcloud pubsub subscriptions create SUBSCRIPTION_ID \ --topic=TOPIC_ID \ --min-retry-delay=MIN_RETRY_DELAY \ --max-retry-delay=MAX_RETRY_DELAY
無效信件主題
如果 Pub/Sub 服務嘗試傳送訊息,但訂閱端無法確認,Pub/Sub 可以將無法傳送的訊息轉送至無效信件主題。
無效信件主題如何與 Pub/Sub 搭配運作
無效信件主題是訂閱屬性,而非主題屬性。也就是說,您必須在建立訂閱項目時設定死信主題,而不是在建立主題時設定。
如果您建立死信主題,可以設定下列訂閱屬性:
傳送嘗試次數上限:這個數值代表 Pub/Sub 針對特定訊息嘗試傳送的次數。如果訂閱端用戶端無法在設定的傳送嘗試次數內確認訊息,系統會將訊息轉寄至無效信件主題。
- 預設值 = 5
- 最大值 = 100
- 最小值 = 5
含有無效信件主題的專案:如果無效信件主題位於與訂閱項目不同的專案中,您必須指定含有無效信件主題的專案。將無效信件主題設為與附加訂閱項目的主題不同的主題。
傳送嘗試次數上限的計算方式
只有在無效信件主題設定正確且包含正確的 IAM 權限時,Pub/Sub 才會計算傳送嘗試次數。
由於 Pub/Sub 會盡力轉送無法傳送的訊息,因此傳送嘗試次數上限僅為預估值。
系統追蹤的訊息傳送嘗試次數也可能會重設為零,尤其是針對有非活躍訂閱者的拉取訂閱。因此,訊息傳送至訂閱者用戶端的次數,可能會超過設定的傳送嘗試次數上限。
設定無效信件主題
如要設定無效信件主題,來源主題必須先有訂閱項目。您可以在建立訂閱時指定死信主題,也可以更新現有訂閱項目,讓其擁有死信主題。
以下是啟用訂閱項目的死信工作流程。
建立無效信件主題。這個主題與來源主題無關。
在來源主題的訂閱項目中設定無效信件主題。
為避免無效信件主題中的訊息遺失,請將至少一個其他訂閱項目附加至無效信件主題。次要訂閱項目會接收來自無效信件主題的訊息。
將發布者和訂閱者角色授予 Pub/Sub 服務帳戶。詳情請參閱「授予轉送權限」。
在新的訂閱項目上設定無效信件主題
您可以使用Google Cloud 控制台、Google Cloud CLI、用戶端程式庫或 Pub/Sub API 建立訂閱項目,並設定死信主題。
控制台
如要建立訂閱項目並設定死信主題,請完成下列步驟:
在 Google Cloud 控制台中,前往「訂閱項目」頁面。
按一下「Create Subscription」 (建立訂閱項目)。
輸入「Subscription ID」(訂閱 ID)。
從下拉式選單中選擇或建立主題。
訂閱項目會接收主題的訊息。
在「Dead lettering」(無效信件) 部分,選取「Enable dead lettering」(啟用無效信件)。
從下拉式選單中選擇或建立死信主題。
如果所選無效信件主題沒有訂閱項目,系統會提示您建立一個。
在「傳送嘗試次數上限」欄位中,指定介於 5 至 100 的整數。
按一下 [建立]。
詳細資料窗格會顯示可採取的行動項目清單。如果任何項目顯示錯誤圖示
,請按一下動作項目來解決問題。
gcloud
如要建立訂閱並設定死信主題,請使用 gcloud pubsub subscriptions create
指令:
gcloud pubsub subscriptions create subscription-id \ --topic=topic-id \ --dead-letter-topic=dead-letter-topic-name \ [--max-delivery-attempts=max-delivery-attempts] \ [--dead-letter-topic-project=dead-letter-topic-project]
C++
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 C++ 環境。詳情請參閱 Pub/Sub C++ API 參考說明文件。
C#
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 C# 環境。詳情請參閱 Pub/Sub C# API 參考說明文件。
Go
在試用這個範例之前,請先按照 快速入門:使用用戶端程式庫中的 Go 設定說明進行操作。詳情請參閱 Pub/Sub Go API 參考說明文件。
Java
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 Java 環境。詳情請參閱 Pub/Sub Java API 參考說明文件。
Node.js
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 Node.js 環境。詳情請參閱 Pub/Sub Node.js API 參考說明文件。
Node.js
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 Node.js 環境。詳情請參閱 Pub/Sub Node.js API 參考說明文件。
PHP
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的 PHP 設定說明進行操作。詳情請參閱 Pub/Sub PHP API 參考說明文件。
Python
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 Python 環境。詳情請參閱 Pub/Sub Python API 參考說明文件。
Ruby
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 Ruby 環境。詳情請參閱 Pub/Sub Ruby API 參考說明文件。
Ruby
在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 Ruby。詳情請參閱 Pub/Sub Ruby API 參考說明文件。
如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
為現有訂閱項目設定無效信件主題
您可以使用Google Cloud 控制台、Google Cloud CLI、用戶端程式庫或 Pub/Sub API 更新訂閱項目,並設定死信主題。
控制台
如要更新訂閱項目並設定死信主題,請完成下列步驟。
在 Google Cloud 控制台中,前往「訂閱項目」頁面。
在要更新的訂閱項目旁邊,按一下「更多動作」more_vert。
在內容選單中,選取「編輯」。
在「Dead lettering」(無效信件) 部分,選取「Enable dead lettering」(啟用無效信件)。
從下拉式選單中選擇或建立主題。
如果所選主題沒有訂閱項目,系統會提示您建立訂閱項目。
在「傳送嘗試次數上限」欄位中,指定介於 5 至 100 的整數。
按一下「更新」。
詳細資料窗格會顯示可採取的行動項目清單。如果任何項目顯示錯誤圖示
,請按一下動作項目來解決問題。
gcloud
如要更新訂閱項目並設定死信主題,請使用 gcloud pubsub subscriptions update
指令:
gcloud pubsub subscriptions update subscription-id \ --dead-letter-topic=dead-letter-topic-name \ [--max-delivery-attempts=max-delivery-attempts] \ [--dead-letter-topic-project=dead-letter-topic-project]
C++
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 C++ 環境。詳情請參閱 Pub/Sub C++ API 參考說明文件。
C#
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 C# 環境。詳情請參閱 Pub/Sub C# API 參考說明文件。
Go
在試用這個範例之前,請先按照 快速入門:使用用戶端程式庫中的 Go 設定說明進行操作。詳情請參閱 Pub/Sub Go API 參考說明文件。
Java
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 Java 環境。詳情請參閱 Pub/Sub Java API 參考說明文件。
Node.js
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 Node.js 環境。詳情請參閱 Pub/Sub Node.js API 參考說明文件。
PHP
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的 PHP 設定說明進行操作。詳情請參閱 Pub/Sub PHP API 參考說明文件。
Python
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 Python 環境。詳情請參閱 Pub/Sub Python API 參考說明文件。
Ruby
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 Ruby 環境。詳情請參閱 Pub/Sub Ruby API 參考說明文件。
Ruby
在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 Ruby。詳情請參閱 Pub/Sub Ruby API 參考說明文件。
如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
授予 IAM 角色以使用無效信件主題
如要將無法傳送的訊息轉送至無效信件主題,Pub/Sub 必須具備下列權限:
- 將訊息發布至主題。
- 確認訊息,將其從訂閱項目中移除。
Pub/Sub 會為每個專案建立並維護服務帳戶:service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com
。您可以為這個服務帳戶指派發布者和訂閱者角色,藉此授予轉寄權限。
控制台
如要授予 Pub/Sub 將訊息發布至死信主題的權限,請完成下列步驟:
在 Google Cloud 控制台中,前往「訂閱項目」頁面。
按一下含有死信主題的訂閱項目名稱。
按一下「Dead lettering」(死字處理) 分頁標籤。
如要指派發布者角色,請按一下「授予發布者角色」。如果已成功指派發布者角色,您會看到藍色勾號
。如要指派訂閱者角色,請按一下「授予訂閱者角色」。如果已成功指派發布者角色,您會看到藍色勾號
。
gcloud
如要授予 Pub/Sub 權限,以便將訊息發布至死信主題,請執行下列指令:
PUBSUB_SERVICE_ACCOUNT="service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud pubsub topics add-iam-policy-binding dead-letter-topic-name \ --member="serviceAccount:$PUBSUB_SERVICE_ACCOUNT"\ --role="roles/pubsub.publisher"
如要授予 Pub/Sub 權限,讓其確認轉寄的無法送達訊息,請執行下列指令:
PUBSUB_SERVICE_ACCOUNT="service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud pubsub subscriptions add-iam-policy-binding subscription-id \ --member="serviceAccount:$PUBSUB_SERVICE_ACCOUNT"\ --role="roles/pubsub.subscriber"
追蹤傳送嘗試
為訂閱項目啟用無效信件主題後,該訂閱項目中的每則訊息都會包含一個欄位,用來指定傳送嘗試次數:
透過拉取訂閱接收的訊息會包含
delivery_attempt
欄位。透過推送訂閱項目收到的訊息會包含
deliveryAttempt
欄位。
下列範例說明如何取得傳送嘗試次數:
C++
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 C++ 環境。詳情請參閱 Pub/Sub C++ API 參考說明文件。
C#
在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 C#。詳情請參閱 Pub/Sub C# API 參考說明文件。
如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Go
在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 Go。詳情請參閱 Pub/Sub Go API 參考說明文件。
如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Java
在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 Java。詳情請參閱 Pub/Sub Java API 參考說明文件。
如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Node.js
在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 Node.js。詳情請參閱 Pub/Sub Node.js API 參考說明文件。
如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
PHP
在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 PHP。詳情請參閱 Pub/Sub PHP API 參考說明文件。
如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Python
在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 Python。詳情請參閱 Pub/Sub Python API 參考說明文件。
如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Ruby
在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 Ruby。詳情請參閱 Pub/Sub Ruby API 參考說明文件。
如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
當 Pub/Sub 將無法傳送的訊息轉送至無效信件主題時,會為訊息新增下列屬性:
CloudPubSubDeadLetterSourceDeliveryCount
:傳送至來源訂閱項目的嘗試次數。CloudPubSubDeadLetterSourceSubscription
:來源訂閱項目的名稱。CloudPubSubDeadLetterSourceSubscriptionProject
:包含來源訂閱項目的專案名稱。CloudPubSubDeadLetterSourceTopicPublishTime
:訊息最初發布時的時間戳記。CloudPubSubDeadLetterSourceDeliveryErrorMessage
:郵件無法傳送至原始目的地的理由。這個屬性僅適用於匯出訂閱項目。
監控轉寄的郵件
轉寄無法送達的訊息後,Pub/Sub 服務會從訂閱項目中移除該訊息。您可以使用 Cloud Monitoring 監控轉寄的訊息。
如果您將訂閱項目附加至無效信件主題,訊息會使用附加訂閱項目的到期政策,而非附加無效信件主題屬性的訂閱項目到期期限。
subscription/dead_letter_message_count
指標會記錄 Pub/Sub 從訂閱轉寄的無法送達訊息數量。
詳情請參閱「監控轉寄的無法送達郵件」。
移除無效信件主題
如要停止轉寄無法送達的訊息,請從訂閱項目中移除無效信件主題。
您可以使用Google Cloud 控制台、Google Cloud CLI 或 Pub/Sub API,從訂閱中移除死信主題。
控制台
如要從訂閱項目中移除死信主題,請完成下列步驟:
在 Google Cloud 控制台中,前往「訂閱項目」頁面。
在訂閱項目清單中,按一下要更新的訂閱項目旁的 more_vert。
在內容選單中選取「編輯」。
在「Dead lettering」(無效信件) 專區中,清除「Enable dead lettering」(啟用無效信件) 核取方塊。
按一下「更新」。
gcloud
如要從訂閱中移除死信主題,請使用 gcloud pubsub subscriptions update
指令和 --clear-dead-letter-policy
標記:
gcloud pubsub subscriptions update subscription-id \ --clear-dead-letter-policy
C++
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 C++ 環境。詳情請參閱 Pub/Sub C++ API 參考說明文件。
C#
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 C# 環境。詳情請參閱 Pub/Sub C# API 參考說明文件。
Go
在試用這個範例之前,請先按照 快速入門:使用用戶端程式庫中的 Go 設定說明進行操作。詳情請參閱 Pub/Sub Go API 參考說明文件。
Java
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 Java 環境。詳情請參閱 Pub/Sub Java API 參考說明文件。
Node.js
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 Node.js 環境。詳情請參閱 Pub/Sub Node.js API 參考說明文件。
PHP
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的 PHP 設定說明進行操作。詳情請參閱 Pub/Sub PHP API 參考說明文件。
Python
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 Python 環境。詳情請參閱 Pub/Sub Python API 參考說明文件。
Ruby
在嘗試這個範例之前,請先按照 快速入門:使用用戶端程式庫中的操作說明設定 Ruby 環境。詳情請參閱 Pub/Sub Ruby API 參考說明文件。
Ruby
在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 Ruby。詳情請參閱 Pub/Sub Ruby API 參考說明文件。
如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
定價
當 Pub/Sub 服務轉寄無法送達的訊息時,會收取下列費用:
- 發布費用會計入與含有死信主題的專案相關聯的帳單帳戶。
- 傳送訊息的訂閱費用會計入與專案相關聯的帳單帳戶,該專案包含含有死信主題屬性的訂閱項目。
如果您設定訂閱項目的死信主題屬性,但死信主題的訊息儲存位置政策不允許含有訂閱項目的區域,系統也會針對傳出訊息收取發布費用。
外寄訊息的發布費用將計入包含死信主題的專案。詳情請參閱「定價」。