訂閱者可能因為各種原因無法處理訊息。舉例來說,擷取處理訊息所需資料時,可能會發生暫時性問題。或者,訊息格式與訂閱者預期不符。
本頁說明如何使用訂閱重試政策,或將未傳送的訊息轉送至死信主題 (也稱為死信佇列),處理這類處理失敗情形。
請注意,Dataflow 不支援這些功能。詳情請參閱 Dataflow 說明文件的「不支援的 Pub/Sub 功能」一節。
訂閱項目重試政策
如果 Pub/Sub 嘗試傳送訊息,但訂閱端無法確認,Pub/Sub 會自動嘗試重新傳送訊息。這項重新傳送的嘗試稱為訂閱項目重試政策。這項功能無法開啟或關閉,但你可以選擇要使用的重試政策類型。
首次建立及設定訂閱項目時,您可以選擇使用下列其中一種重試政策:「立即重新傳送」或「指數輪詢」。根據預設,訂閱項目會立即重新傳送。
立即重新配送
根據預設,Pub/Sub 會立即嘗試重新傳送訊息 (可能傳送至同一個訂閱端用戶端)。不過,如果導致訊息確認失敗的條件沒有改變,立即重新傳送可能會造成問題。在這種情況下,Pub/Sub 可能會重新傳送多則無法確認的訊息。
為解決立即重新傳送的問題,Pub/Sub 可讓您設定指數輪詢政策。
指數輪詢
指數輪詢可讓您在每次重試之間加入逐漸增加的延遲時間。首次傳送失敗後,Pub/Sub 會等待最短的輪詢延遲時間,然後再重試。每次連續傳送訊息失敗,延遲時間就會增加,最多可達延遲上限 (0 和 600 秒)。
延遲間隔上限和下限並非固定值,應根據應用程式的當地因素進行設定。
請注意下列有關指數輪詢的注意事項:
- 指數輪詢會在下列動作中觸發:
- 收到否定確認時。
- 訊息的確認期限已過。
- 指數輪詢延遲只會套用至個別訊息,而非訂閱項目 (全域) 中的所有訊息。
- 使用指數輪詢時,即使先前收到的訊息收到負面確認,Pub/Sub 仍會繼續傳送其他訊息 (除非您使用依序傳送訊息功能)。
如果系統暫時無法處理部分訊息,您可以運用重試政策延遲傳送及處理這類訊息。這項功能會盡量套用,且系統會分別評估每封訊息的重試政策。
我們不建議使用這項功能,刻意延遲訊息傳送。如果對設定重試政策的訂閱項目,大量負面確認 (nack) 訊息,部分訊息可能會以較少或沒有退避的方式傳送。如果大量 NACK 訊息,Pub/Sub 也可能會減緩所有訊息的傳送速度。
如需排定傳送時間,請考慮使用 Cloud Tasks。
設定指數輪詢
控制台
建立新訂閱項目時,您可以按照下列步驟設定指數輪詢重試政策:
前往 Google Cloud 控制台的「Pub/Sub subscriptions」(Pub/Sub 訂閱項目) 頁面。
按一下「Create Subscription」 (建立訂閱項目)。
在「Subscription ID」(訂閱項目 ID) 欄位中輸入名稱。
如要瞭解如何命名訂閱項目,請參閱「主題或訂閱項目命名規範」。
從下拉式選單中選擇或建立主題。
訂閱項目會接收來自主題的訊息。
選取「傳送類型」。
在「重試政策」下方,選取「在指數輪詢延遲時間過後重試」。
輸入 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 控制台的「Subscriptions」(訂閱項目) 頁面。
按一下「Create Subscription」 (建立訂閱項目)。
輸入訂閱 ID。
從下拉式選單中選擇或建立主題。
訂閱項目會接收來自主題的訊息。
在「無效信件」部分,選取「啟用無效信件」。
從下拉式選單中選擇或建立死信主題。
如果所選無效信件主題沒有訂閱項目,系統會提示您建立訂閱項目。
在「傳送嘗試次數上限」欄位中,指定介於 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
在試用這個範例之前,請先按照Ruby「Pub/Sub 快速入門導覽課程:使用用戶端程式庫」中的操作說明進行設定。 詳情請參閱 Pub/Sub Ruby API 參考說明文件。
如要驗證 Pub/Sub,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
為現有訂閱項目設定無效信件主題
您可以使用Google Cloud 控制台、Google Cloud CLI、用戶端程式庫或 Pub/Sub API 更新訂閱項目,並設定無法傳送的訊息主題。
控制台
如要更新訂閱項目並設定無法傳送訊息的主題,請完成下列步驟。
前往 Google Cloud 控制台的「Subscriptions」(訂閱項目) 頁面。
找到要更新的訂閱項目,然後按一下旁邊的「更多動作」圖示 more_vert。
在內容選單中,選取「編輯」。
在「無效信件」部分,選取「啟用無效信件」。
從下拉式選單中選擇或建立主題。
如果所選主題沒有訂閱項目,系統會提示您建立。
在「傳送嘗試次數上限」欄位中,指定介於 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
在試用這個範例之前,請先按照Ruby「Pub/Sub 快速入門導覽課程:使用用戶端程式庫」中的操作說明進行設定。 詳情請參閱 Pub/Sub Ruby API 參考說明文件。
如要驗證 Pub/Sub,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
授予 IAM 角色,以使用無效信件主題
如要將無法傳送的訊息轉送至無效信件主題,Pub/Sub 必須具備下列權限:
- 將訊息發布至主題。
- 確認訊息,將訊息從訂閱項目中移除。
Pub/Sub 會為每個專案建立及維護服務帳戶:
service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com
。
您可以將發布者和訂閱者角色指派給這個服務帳戶,藉此授予轉送權限。
控制台
如要授予 Pub/Sub 權限,將訊息發布至死信主題,請完成下列步驟:
前往 Google Cloud 控制台的「Subscriptions」(訂閱項目) 頁面。
按一下具有無法傳送郵件主題的訂閱項目名稱。
按一下「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#
在試用這個範例之前,請先按照C#「Pub/Sub 快速入門導覽課程:使用用戶端程式庫」中的操作說明進行設定。 詳情請參閱 Pub/Sub C# API 參考說明文件。
如要驗證 Pub/Sub,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Go
在試用這個範例之前,請先按照Go「Pub/Sub 快速入門導覽課程:使用用戶端程式庫」中的操作說明進行設定。 詳情請參閱 Pub/Sub Go API 參考說明文件。
如要驗證 Pub/Sub,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Java
在試用這個範例之前,請先按照Java「Pub/Sub 快速入門導覽課程:使用用戶端程式庫」中的操作說明進行設定。 詳情請參閱 Pub/Sub Java API 參考說明文件。
如要驗證 Pub/Sub,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Node.js
在試用這個範例之前,請先按照Node.js「Pub/Sub 快速入門導覽課程:使用用戶端程式庫」中的操作說明進行設定。 詳情請參閱 Pub/Sub Node.js API 參考說明文件。
如要驗證 Pub/Sub,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
PHP
在試用這個範例之前,請先按照PHP「Pub/Sub 快速入門導覽課程:使用用戶端程式庫」中的操作說明進行設定。 詳情請參閱 Pub/Sub PHP API 參考說明文件。
如要驗證 Pub/Sub,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Python
在試用這個範例之前,請先按照Python「Pub/Sub 快速入門導覽課程:使用用戶端程式庫」中的操作說明進行設定。 詳情請參閱 Pub/Sub Python API 參考說明文件。
如要驗證 Pub/Sub,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Ruby
在試用這個範例之前,請先按照Ruby「Pub/Sub 快速入門導覽課程:使用用戶端程式庫」中的操作說明進行設定。 詳情請參閱 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 控制台的「Subscriptions」(訂閱項目) 頁面。
在訂閱項目清單中,按一下要更新的訂閱項目旁邊的 more_vert。
在內容選單中,選取「編輯」。
在「無效信件」專區中,清除「啟用無效信件」核取方塊。
按一下「更新」。
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
在試用這個範例之前,請先按照Ruby「Pub/Sub 快速入門導覽課程:使用用戶端程式庫」中的操作說明進行設定。 詳情請參閱 Pub/Sub Ruby API 參考說明文件。
如要驗證 Pub/Sub,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
定價
如果 Pub/Sub 服務轉送無法傳送的訊息,則適用下列費用:
- 發布費用會計入與含有死信主題的專案相關聯的帳單帳戶。
- 系統會向與專案相關聯的帳單帳戶收取外送訊息的訂閱費用,而專案包含具有死信主題屬性的訂閱項目。
如果您為訂閱項目設定 dead-letter 主題屬性,但 dead-letter 主題的訊息儲存位置政策不允許包含訂閱項目的區域,系統也會收取輸出訊息的發布費用。
外寄訊息的發布費用會計入包含死信主題的專案。詳情請參閱「定價」。