訂閱者可能因各種原因無法處理訊息。舉例來說,系統在擷取處理訊息所需的資料時,可能會發生暫時性問題。或者,訊息的格式可能與訂閱端預期的不同。
如要管理訂閱者無法確認的無法傳遞訊息,Pub/Sub 可以將這些訊息轉送至 dead-letter 主題 (也稱為 dead-letter 佇列)。
事前準備
為 dead-letter 主題設定建立主題。
或者,如果您從頭到尾按照本頁所有指示操作,可以在後續步驟中建立主題。
必要的角色
如要取得管理主題和訂閱項目所需的權限,請要求管理員授予您專案的「Pub/Sub 編輯者」 (roles/pubsub.editor) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
您可以在專案層級和個別資源層級設定存取控管機制。您可以在一個專案中建立訂閱項目,並附加至其他專案中的主題。請確認您具備各專案的必要權限。
dead-letter 主題的運作方式
如果訂閱端應用程式無法確認訊息,Pub/Sub 會重試傳送,直到確認期限到期或訊息過期為止。在嘗試傳送訊息的次數達到設定值後,Pub/Sub 可以將無法傳送的訊息轉送至無效信件主題。
Pub/Sub 轉送無法傳遞的訊息時,會將原始訊息包裝在新訊息中,並新增屬性來識別來源訂閱項目。接著,訊息會傳送至指定的 dead-letter 主題。然後,附加至無效信件主題的個別訂閱項目可以接收這些轉送的訊息,以供分析及離線偵錯。
傳送嘗試次數上限的計算方式
只有在正確設定 dead-letter 主題,並包含正確的 IAM 權限時,Pub/Sub 才會計算傳送嘗試次數。
傳送嘗試次數上限為近似值,因為 Pub/Sub 會盡力轉送無法傳送的訊息。服務可能會在嘗試次數少於設定次數後轉送訊息,也可能在轉送前多嘗試幾次。
訊息的追蹤傳送嘗試次數也可能會重設為零,特別是具有非使用中訂閱者的提取訂閱項目。因此,傳送給訂閱端用戶端的訊息次數,可能會超過設定的傳送嘗試次數上限。
dead-letter 主題屬性
您可以在 dead-letter 主題上設定下列訂閱屬性。
嘗試傳送次數上限:數值,表示 Pub/Sub 嘗試傳送特定訊息的次數。如果訂閱端在設定的傳送嘗試次數內無法確認訊息,系統就會將訊息轉送至 dead-letter 主題。
- 預設值 = 5
- 最大值 = 100
- 最小值 = 5
含有 dead-letter 主題的專案:如果 dead-letter 主題與訂閱項目位於不同專案,您必須指定含有 dead-letter 主題的專案。將 dead-letter 主題設為與訂閱項目附加的主題不同的主題。
設定 dead-letter 主題
以下步驟說明如何使用無法傳送訊息的主題。
建立主題 (做為 dead-letter 主題)。
為 dead-letter 主題建立訂閱項目。
在訂閱方案中啟用無效信件。
將先前建立的主題附加至訂閱項目。
為 Pub/Sub 服務帳戶授予必要角色,以便使用死信主題。
建立要搭配無效信件主題使用的主題
如果您已建立主題供訂閱項目使用,可以略過這個步驟。
前往 Google Cloud 控制台的「Topics」(主題) 頁面。
按一下「建立主題」。
輸入「主題 ID」,例如
my-test-topic。保留預設訂閱方案的選項,然後點選「建立」。
在訂閱項目中設定 dead-letter 主題
您可以在新訂閱項目或現有訂閱項目中設定 dead-letter 主題。
為新訂閱項目設定 dead-letter 主題
您可以使用Google Cloud 控制台、Google Cloud CLI、用戶端程式庫或 Pub/Sub API,建立訂閱項目並設定 dead-letter 主題。
控制台
如要建立訂閱項目並設定 dead-letter 主題,請完成下列步驟:
前往 Google Cloud 控制台的「Subscriptions」(訂閱項目) 頁面。
按一下「Create Subscription」 (建立訂閱項目)。
輸入訂閱 ID。
選擇要搭配訂閱方案使用的主題。訂閱項目會接收主題的訊息。這「不是」您的 dead-letter 主題。 您會在下一個步驟中選擇。
在「Dead lettering」(無法投遞的郵件) 部分,選取「Enable dead lettering」(啟用無法投遞的郵件)。
從下拉式選單中選擇 dead-letter 主題。
如果所選的 dead-letter 主題沒有訂閱項目,系統會提示您建立訂閱項目。
在「傳送嘗試次數上限」欄位中,指定介於 5 至 100 之間的整數。
點選「建立」。
點選「詳細資料」面板,找出可能的待辦事項。如果任何項目顯示錯誤圖示 ,請按一下該待辦事項來解決問題。

gcloud
如要建立訂閱項目並設定 dead-letter 主題,請使用 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 Pub/Sub 用戶端程式庫第 3 版。如果您仍在使用第 2 版程式庫,請參閱 第 3 版遷移指南。如要查看 Ruby 第 2 版程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照「快速入門導覽課程:使用用戶端程式庫」中的 Ruby 設定操作說明操作。詳情請參閱 Pub/Sub Ruby API 參考文件。
Ruby
在試用這個範例之前,請先按照「使用用戶端程式庫的 Pub/Sub 快速入門導覽課程」中的 Ruby 設定說明操作。詳情請參閱 Pub/Sub Ruby API 參考文件。
如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Rust
在試用這個範例之前,請先按照「快速入門導覽課程:使用用戶端程式庫」中的 Rust 設定說明操作。詳情請參閱 Pub/Sub Rust API 參考文件。
為現有訂閱項目設定 dead-letter 主題
您可以使用Google Cloud 控制台、gcloud CLI、用戶端程式庫或 Pub/Sub API,更新訂閱項目並設定 dead-letter 主題。
控制台
如要更新訂閱項目並設定 dead-letter 主題,請完成下列步驟。
前往 Google Cloud 控制台的「Subscriptions」(訂閱項目) 頁面。
找到要更新的訂閱項目,然後按一下旁邊的「更多動作」圖示 more_vert。
在內容選單中,選取「編輯」。

在「Dead lettering」(無法投遞的郵件) 部分,選取「Enable dead lettering」(啟用無法投遞的郵件)。
從下拉式選單中選擇 dead-letter 主題。
如果所選的 dead-letter 主題沒有訂閱項目,系統會提示您建立訂閱項目。
在「傳送嘗試次數上限」欄位中,指定介於 5 至 100 之間的整數。
按一下「Update」。
點選「詳細資料」面板,找出可能的待辦事項。如果任何項目顯示錯誤圖示 ,請按一下該待辦事項來解決問題。

gcloud
如要更新訂閱項目並設定 dead-letter 主題,請使用 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 Pub/Sub 用戶端程式庫第 3 版。如果您仍在使用第 2 版程式庫,請參閱 第 3 版遷移指南。如要查看 Ruby 第 2 版程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照「快速入門導覽課程:使用用戶端程式庫」中的 Ruby 設定操作說明操作。詳情請參閱 Pub/Sub Ruby API 參考文件。
Ruby
在試用這個範例之前,請先按照「使用用戶端程式庫的 Pub/Sub 快速入門導覽課程」中的 Ruby 設定說明操作。詳情請參閱 Pub/Sub Ruby API 參考文件。
如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
授予 IAM 角色,以便使用 dead-letter 主題
如要將無法傳遞的訊息轉送至 dead-letter 主題,Pub/Sub 必須具備下列權限:
- 將訊息發布至主題。
- 確認訊息,系統就會從訂閱項目中移除這些訊息。
Pub/Sub 會為每個專案建立及維護服務帳戶:
service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com。
如要授予轉送權限,請將發布者和訂閱者角色指派給這個服務帳戶。
控制台
如要授予 Pub/Sub 權限,將訊息發布至 dead-letter 主題,請完成下列步驟:
前往 Google Cloud 控制台的「Subscriptions」(訂閱項目) 頁面。
按一下含有 dead-letter 主題的訂閱項目名稱。
按一下「Dead lettering」(無法投遞的郵件) 分頁標籤。
如要指派發布者角色,請按一下「授予發布者角色」。如果已成功指派發布者角色,您會看到藍色勾號 。
如要指派訂閱者角色,請按一下「授予訂閱者角色」。如果已成功指派發布者角色,您會看到藍色勾號 。
gcloud
如要授予 Pub/Sub 權限,將訊息發布至 dead-letter 主題,請執行下列指令:
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"
追蹤投遞嘗試次數
為訂閱項目啟用 dead-letter 主題後,該訂閱項目的每則訊息都會有一個欄位,用於指定傳送嘗試次數:
透過提取訂閱項目收到的訊息會包含
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 Pub/Sub 用戶端程式庫第 3 版。如果您仍在使用第 2 版程式庫,請參閱 第 3 版遷移指南。如要查看 Ruby 第 2 版程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照「快速入門導覽課程:使用用戶端程式庫」中的 Ruby 設定操作說明操作。詳情請參閱 Pub/Sub Ruby API 參考文件。
Rust
在試用這個範例之前,請先按照「快速入門導覽課程:使用用戶端程式庫」中的 Rust 設定說明操作。詳情請參閱 Pub/Sub Rust API 參考文件。
當 Pub/Sub 將無法傳遞的訊息轉送至 dead-letter 主題時,會將下列屬性新增至訊息:
CloudPubSubDeadLetterSourceDeliveryCount:傳送至來源訂閱項目的嘗試次數。CloudPubSubDeadLetterSourceSubscription:來源訂閱項的名稱。CloudPubSubDeadLetterSourceSubscriptionProject:包含來源訂閱項目的專案名稱。CloudPubSubDeadLetterSourceTopicPublishTime:訊息最初發布時的時間戳記。CloudPubSubDeadLetterSourceDeliveryErrorMessage:郵件無法傳送至原始目的地的原因。這項屬性僅適用於匯出訂閱項目。
監控轉寄的郵件
轉送無法送達的訊息後,Pub/Sub 服務會從訂閱項目中移除該訊息。您可以使用 Cloud Monitoring 監控轉寄的訊息。
如果將訂閱項目附加至 dead-letter 主題,訊息會使用附加訂閱項目的到期政策,而不是具有 dead-letter 主題屬性的訂閱項目到期時間。
subscription/dead_letter_message_count 指標會記錄 Pub/Sub 從訂閱項目轉送的無法傳遞訊息數量。
詳情請參閱「監控轉寄的無法傳送郵件」。
移除 dead-letter 主題
如要停止轉送無法傳遞的訊息,請從訂閱項目中移除 dead-letter 主題。
您可以使用Google Cloud 控制台、gcloud CLI 或 Pub/Sub API,從訂閱項目中移除 dead-letter 主題。
控制台
如要從訂閱項目中移除死信主題,請完成下列步驟:
前往 Google Cloud 控制台的「Subscriptions」(訂閱項目) 頁面。
在訂閱項目清單中,按一下要更新的訂閱項目旁邊的 more_vert。
在內容選單中選取「編輯」。

在「Dead lettering」(無法投遞的郵件) 專區中,取消勾選「Enable dead lettering」(啟用無法投遞的郵件)。
按一下「Update」。
gcloud
如要從訂閱項目中移除 dead-letter 主題,請使用 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 Pub/Sub 用戶端程式庫第 3 版。如果您仍在使用第 2 版程式庫,請參閱 第 3 版遷移指南。如要查看 Ruby 第 2 版程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照「快速入門導覽課程:使用用戶端程式庫」中的 Ruby 設定操作說明操作。詳情請參閱 Pub/Sub Ruby API 參考文件。
Ruby
在試用這個範例之前,請先按照「使用用戶端程式庫的 Pub/Sub 快速入門導覽課程」中的 Ruby 設定說明操作。詳情請參閱 Pub/Sub Ruby API 參考文件。
如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
定價
Pub/Sub 服務轉送無法傳遞的訊息時,會收取下列費用:
- 發布費用會計入與含有 dead-letter 主題的專案相關聯的帳單帳戶。
- 外送訊息的訂閱費用會計入與專案相關聯的帳單帳戶,而專案包含具有 dead-letter 主題屬性的訂閱項目。
如果您設定訂閱項目的 dead-letter 主題屬性,但 dead-letter 主題的訊息儲存位置政策不允許包含訂閱項目的區域,系統也會收取外送訊息的發布費用。
系統會向包含 dead-letter 主題的專案收取外寄訊息的發布費用。詳情請參閱「定價」。