瞭解實用的疑難排解步驟,解決您在使用 Pub/Sub 時遇到的問題。
無法建立主題
確認您具備必要的權限。如要建立 Pub/Sub 主題,您必須在專案中擁有 Pub/Sub 編輯者 (roles/pubsub.editor
) 身分與存取權管理角色。如果您沒有這個角色,請與管理員聯絡。如要進一步瞭解相關主題的疑難排解資訊,請參閱下列頁面:
無法建立訂閱
請確認你已完成下列事項:
確認您具備必要的權限。如要建立 Pub/Sub 訂閱項目,您需要在專案中具備 Pub/Sub 編輯者 (roles/pubsub.editor) IAM 角色。如果您沒有這個角色,請與管理員聯絡。
指定訂閱名稱。
指定要附加訂閱項目的現有主題名稱。
如果您要建立推播訂閱項目,請在
pushEndpoint
欄位中以小寫 (而非http://
或HTTPS://
) 指定https://
,做為接收網址的通訊協定。
如要進一步瞭解如何排解訂閱問題,請參閱下列頁面:
排解拉取、推送、BigQuery 或 Cloud Storage 相關問題
排解權限問題
Pub/Sub 權限會控制哪些使用者和服務帳戶可以對您的 Pub/Sub 資源執行動作。如果權限設定有誤,可能會導致權限遭拒錯誤,並中斷訊息流程。稽核記錄會詳細記錄所有權限變更,方便您找出這些問題的來源。
如要使用稽核記錄排解 Pub/Sub 權限問題,請按照下列步驟操作:
取得查看 記錄檔探索工具 所需的權限。
詳情請參閱「事前準備」一節。
前往 Google Cloud 控制台的「Logs Explorer」頁面。
選取現有的 Google Cloud 專案、資料夾或機構。
以下列出可用於尋找相關記錄的篩選器:
resource.type="pubsub_topic" OR resource.type="pubsub_subscription"
:如要排解可能涉及變更主題或訂閱設定或存取控制的任何問題,請以這項查詢做為起點。您可以將其與其他篩選器結合,進一步縮小搜尋範圍。protoPayload.methodName="google.iam.v1.SetIamPolicy"
:如果您懷疑問題是因為權限不正確或缺少權限,請使用這項查詢。這有助於您追蹤誰變更了身分與存取權管理政策,以及變更內容。這項功能可用於排解疑難,例如使用者無法發布主題或訂閱項目、應用程式無法存取 Pub/Sub 資源,或是存取權控管發生異常變更。protoPayload.status.code=7
:如果遇到與權限明確相關的錯誤,請使用這項查詢。這有助於您找出哪些動作失敗,以及哪些人嘗試執行這些動作。您可以將這項查詢與先前的查詢結合,找出可能導致權限遭拒的特定資源和 IAM 政策變更。
分析記錄,判斷事件的時間戳記、變更者和變更類型等因素。
您可以根據從稽核記錄收集到的資訊採取矯正行動。
訂閱項目已刪除
您可以透過兩種主要方式刪除 Pub/Sub 訂閱項目:
具備足夠權限的使用者或服務帳戶故意刪除訂閱項目。
訂閱項目會在閒置一段時間後自動刪除,預設為 31 天。如要進一步瞭解訂閱項目到期政策,請參閱「到期期限」。
如要排解已刪除的訂閱項目問題,請執行下列步驟:
在 Google Cloud 控制台中,前往 Pub/Sub 訂閱項目頁面,確認訂閱項目已從清單中移除。如要進一步瞭解如何列出訂閱項目,請參閱「列出訂閱項目」。
查看稽核記錄。前往「Logs Explorer」。使用篩選器
protoPayload.methodName="google.pubsub.v1.Subscriber.DeleteSubscription"
找出已刪除的訂閱項目。請檢查記錄,判斷是有人刪除訂閱項目,還是因為閒置而遭到刪除。InternalExpireInactiveSubscription
表示訂閱項目因長時間未使用而遭到刪除。如要進一步瞭解如何使用稽核記錄進行疑難排解,請參閱「使用稽核記錄排解 Pub/Sub 問題」。
403 (Forbidden)
個錯誤
如果您是這類錯誤,請執行下列步驟:
- 請確認您已在Google Cloud 主控台中啟用 Pub/Sub API。
確定提出要求的主體在相關 Pub/Sub API 資源上具有所需權限,特別是您針對跨專案通訊使用 Pub/Sub API 時。
如果您使用 Dataflow,請確認
{PROJECT_NUMBER}@cloudservices.gserviceaccount.com
和 Compute Engine 服務帳戶{PROJECT_NUMBER}-compute@developer.gserviceaccount.com
都具備相關 Pub/Sub API 資源的必要權限。詳情請參閱「Dataflow 安全性與權限」。如果您使用的是 App Engine,請查看專案的「Permissions」(權限) 頁面,瞭解 App Engine 服務帳戶是否列為 Pub/Sub 編輯器。如果不是,請將 App Engine 服務帳戶新增為 Pub/Sub 編輯者。通常,App Engine 服務帳戶的格式為
<project-id>@appspot.gserviceaccount.com
。
其他常見錯誤代碼
如要查看與 Pub/Sub API 相關的其他常見錯誤代碼清單及其說明,請參閱「錯誤代碼」。
使用過度管理作業
如果您發現自己使用太多管理作業配額,就可能需要重構程式碼。您可考慮使用此虛擬程式碼/虛擬碼作為實例。在此範例中,管理作業 (GET
) 用於先檢查訂閱是否存在,然後再嘗試使用其資源。GET
和 CREATE
都是管理員作業:
if !GetSubscription my-sub {
CreateSubscription my-sub
}
Consume from subscription my-sub
更有效率的模式是嘗試由訂閱使用訊息 (假設您能夠合理確定訂閱名稱)。在這種樂觀的方法中,您只會在發生錯誤時取得或建立訂閱。請參閱以下範例:
try {
Consume from subscription my-sub
} catch NotFoundError {
CreateSubscription my-sub
Consume from subscription my-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 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Python
在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 Python。詳情請參閱 Pub/Sub Python API 參考說明文件。
如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
C++
在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 C++。詳情請參閱 Pub/Sub C++ API 參考說明文件。
如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Node.js (TypeScript)
在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 Node.js 環境。 詳情請參閱 Pub/Sub Node.js API 參考說明文件。
如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。