訂閱者可能因為各種原因無法處理訊息。舉例來說,擷取處理訊息所需資料時,可能會發生暫時性問題。或者,訊息格式與訂閱者預期不符。
如要管理訂閱者無法確認的無法傳送訊息,Pub/Sub 可以將這些訊息轉送至無效信件主題 (也稱為無效信件佇列)。
事前準備
為無法傳送訊息的主題設定建立主題。
或者,如果您按照本頁面的所有指示操作,可以在後續步驟中建立主題。
必要的角色
如要取得管理主題和訂閱項目所需的權限,請要求管理員授予您專案的「Pub/Sub 編輯者」 (roles/pubsub.editor
) 身分與存取權管理角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
您可以在專案層級和個別資源層級設定存取權控管。您可以在一個專案中建立訂閱項目,並附加至位於其他專案的主題。請確認您具備各專案的必要權限。
無效信件主題的運作方式
如果訂閱者應用程式無法確認訊息,Pub/Sub 會重試傳送,直到確認期限到期或訊息過期為止。在嘗試傳送訊息的次數達到設定上限後,Pub/Sub 可以將無法傳送的訊息轉送至無效信件主題。
Pub/Sub 轉寄無法傳送的訊息時,會將原始訊息包裝在新訊息中,並新增屬性來識別來源訂閱項目。然後將訊息傳送至指定的無效信件主題。附加至無效信件主題的個別訂閱項目隨後會收到這些轉寄訊息,以供分析和離線偵錯。
傳送嘗試次數上限的計算方式
只有在無效信件主題設定正確,且包含正確的身分與存取權管理權限時,Pub/Sub 才會計算傳送嘗試次數。
傳送嘗試次數上限為近似值,因為 Pub/Sub 會盡力轉送無法傳送的訊息。服務可能會在嘗試次數少於設定次數後轉寄郵件,也可能在轉寄前多嘗試幾次。
訊息的傳送嘗試次數也可能會重設為零,尤其是具有非使用中訂閱者的提取訂閱項目。因此,訊息傳送至訂閱端用戶端的次數,可能會超過設定的傳送嘗試次數上限。
無效信件主題屬性
您可以在死信主題上設定下列訂閱屬性。
嘗試傳送次數上限:數值,代表 Pub/Sub 嘗試傳送特定訊息的次數。如果訂閱端在設定的傳送嘗試次數內無法確認訊息,系統就會將訊息轉送至無效信件主題。
- 預設值 = 5
- 最大值 = 100
- 最小值 = 5
含有無效信件主題的專案:如果無效信件主題與訂閱項目位於不同專案,您必須指定含有無效信件主題的專案。將無效信件主題設為與訂閱項目附加的主題不同的主題。
設定無效信件主題
以下步驟說明如何使用無法傳送訊息的主題。
建立主題 (做為無法傳送訊息的主題)。
為無效信件主題建立訂閱項目。
在訂閱項目上啟用無效信件。
將先前建立的主題附加至訂閱項目。
將使用死信主題所需的角色授予 Pub/Sub 服務帳戶。
建立要搭配無效信件主題使用的主題
如果您已建立要用於訂閱的主題,可以略過這個步驟。
前往 Google Cloud 控制台的「主題」頁面。
按一下「建立主題」。
輸入主題 ID,例如
my-test-topic
。保留預設訂閱方案的選項,然後按一下「建立」。
為訂閱項目設定無效信件主題
您可以在新訂閱項目或現有訂閱項目中設定死信主題。
為新訂閱項目設定無效信件主題
您可以使用Google Cloud 控制台、Google Cloud CLI、用戶端程式庫或 Pub/Sub API,建立訂閱項目並設定無法傳送的訊息主題。
控制台
如要建立訂閱項目並設定無法傳送的訊息主題,請完成下列步驟:
前往 Google Cloud 控制台的「Subscriptions」(訂閱項目) 頁面。
按一下「Create Subscription」 (建立訂閱項目)。
輸入「Subscription ID」(訂閱項目 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 用戶端程式庫的主要版本 (v2)。如果您仍在使用第 1 版程式庫,請參閱第 2 版遷移指南。如要查看第 1 版程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的操作說明設定 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 用戶端程式庫 v3。如果您仍在使用第 2 版程式庫,請參閱 第 3 版遷移指南。如要查看 Ruby 第 2 版程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照「快速入門:使用用戶端程式庫」的操作說明設定 Ruby 環境。詳情請參閱 Pub/Sub Ruby API 參考說明文件。
Ruby
在試用這個範例之前,請先按照Ruby「Pub/Sub 快速入門導覽課程:使用用戶端程式庫」中的操作說明進行設定。 詳情請參閱 Pub/Sub Ruby API 參考說明文件。
如要驗證 Pub/Sub,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
為現有訂閱項目設定無效信件主題
您可以使用Google Cloud 控制台、gcloud CLI、用戶端程式庫或 Pub/Sub API 更新訂閱項目,並設定無法傳送訊息的主題。
控制台
如要更新訂閱項目並設定無法傳送訊息的主題,請完成下列步驟。
前往 Google Cloud 控制台的「Subscriptions」(訂閱項目) 頁面。
找出要更新的訂閱項目,然後按一下旁邊的「更多動作」圖示 more_vert。
在內容選單中,選取「編輯」。
在「無效信件」部分,選取「啟用無效信件」。
從下拉式選單中選擇無效信件主題。
如果所選無效信件主題沒有訂閱項目,系統會提示您建立訂閱項目。
在「傳送嘗試次數上限」欄位中,指定介於 5 至 100 之間的整數。
按一下「Update」。
按一下「詳細資料」面板,找出所有可能的動作項目。如果任何項目顯示錯誤圖示
,請按一下動作項目來解決問題。
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 用戶端程式庫的主要版本 (v2)。如果您仍在使用第 1 版程式庫,請參閱第 2 版遷移指南。如要查看第 1 版程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的操作說明設定 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 用戶端程式庫 v3。如果您仍在使用第 2 版程式庫,請參閱 第 3 版遷移指南。如要查看 Ruby 第 2 版程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照「快速入門:使用用戶端程式庫」的操作說明設定 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 C# API 參考說明文件。
Go
以下範例使用 Go Pub/Sub 用戶端程式庫的主要版本 (v2)。如果您仍在使用第 1 版程式庫,請參閱第 2 版遷移指南。如要查看第 1 版程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的操作說明設定 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 用戶端程式庫 v3。如果您仍在使用第 2 版程式庫,請參閱 第 3 版遷移指南。如要查看 Ruby 第 2 版程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照「快速入門:使用用戶端程式庫」的操作說明設定 Ruby 環境。詳情請參閱 Pub/Sub Ruby API 參考說明文件。
當 Pub/Sub 將無法傳送的訊息轉送至無效信件主題時,會為訊息新增下列屬性:
CloudPubSubDeadLetterSourceDeliveryCount
:傳送至來源訂閱項目的嘗試次數。CloudPubSubDeadLetterSourceSubscription
:來源訂閱項目的名稱。CloudPubSubDeadLetterSourceSubscriptionProject
:包含來源訂閱項目的專案名稱。CloudPubSubDeadLetterSourceTopicPublishTime
:訊息最初發布的時間戳記。CloudPubSubDeadLetterSourceDeliveryErrorMessage
:郵件無法傳送至原始目的地的原因。這項屬性僅適用於匯出訂閱項目。
監控轉寄的郵件
轉送無法傳送的訊息後,Pub/Sub 服務會從訂閱項目中移除該訊息。您可以使用 Cloud Monitoring 監控轉寄的訊息。
如果將訂閱項目附加至無效信件主題,訊息會使用附加訂閱項目的到期政策,而不是具有無效信件主題屬性的訂閱項目到期時間。
subscription/dead_letter_message_count
指標會記錄 Pub/Sub 從訂閱項目轉送的無法遞送訊息數量。
詳情請參閱「監控轉寄的無法傳送郵件」。
移除無效信件主題
如要停止轉寄無法傳送的訊息,請從訂閱項目中移除無效信件主題。
您可以使用Google Cloud 控制台、gcloud CLI 或 Pub/Sub API,從訂閱項目中移除無法傳送訊息的主題。
控制台
如要從訂閱項目中移除死信主題,請完成下列步驟:
前往 Google Cloud 控制台的「Subscriptions」(訂閱項目) 頁面。
在訂閱項目清單中,按一下要更新的訂閱項目旁邊的 more_vert。
在內容選單中,選取「編輯」。
在「無效信件」專區中,清除「啟用無效信件」核取方塊。
按一下「Update」。
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 用戶端程式庫的主要版本 (v2)。如果您仍在使用第 1 版程式庫,請參閱第 2 版遷移指南。如要查看第 1 版程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的操作說明設定 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 用戶端程式庫 v3。如果您仍在使用第 2 版程式庫,請參閱 第 3 版遷移指南。如要查看 Ruby 第 2 版程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照「快速入門:使用用戶端程式庫」的操作說明設定 Ruby 環境。詳情請參閱 Pub/Sub Ruby API 參考說明文件。
Ruby
在試用這個範例之前,請先按照Ruby「Pub/Sub 快速入門導覽課程:使用用戶端程式庫」中的操作說明進行設定。 詳情請參閱 Pub/Sub Ruby API 參考說明文件。
如要驗證 Pub/Sub,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
定價
如果 Pub/Sub 服務轉送無法傳送的訊息,則適用下列費用:
- 發布費用會計入與含有死信主題的專案相關聯的帳單帳戶。
- 系統會向與專案相關聯的帳單帳戶收取外送訊息的訂閱費用,而專案包含具有死信主題屬性的訂閱項目。
如果您為訂閱項目設定 dead-letter 主題屬性,但 dead-letter 主題的訊息儲存位置政策不允許包含訂閱項目的區域,系統也會收取輸出訊息的發布費用。
外寄訊息的發布費用會計入包含死信主題的專案。詳情請參閱「定價」。
## 後續步驟