推送訂閱者指南

Cloud Pub/Sub 支援推送和提取訊息傳送。如要瞭解提取和推送訂閱項目的概況,並對這兩者進行比較,請參閱訂閱者總覽。 這份文件說明推送傳送。有關提取傳送的討論,請參閱提取訂閱者指南

接收推送訊息

Cloud Pub/Sub 伺服器會將訂閱項目的任何訊息傳送至您設定的 Webhook 位址。您的 Webhook 應用程式必須處理收到的訊息並傳回 HTTP 狀態碼才能表示成功。Cloud Pub/Sub 系統會將下列任何 HTTP 狀態碼解讀為成功:200201202204102。如果您的服務傳回其他任何狀態碼,Cloud Pub/Sub 會重試傳送 7 天時間 (標準訊息保留期限)。之後就會將訊息刪除。

推送訂閱項目有下列限制

  • 傳送率上限為每秒 10000 則訊息。
  • 同時未解決的訊息數限制為 10000 則。

未解決的訊息是指已傳送至推送端點,但尚未確認的訊息。

為了判斷系統的最佳傳送率 (同時先將系統超出負荷的可能性降到最低),Cloud Pub/Sub 會使用緩慢啟動演算法

  • 系統會先一次傳送一則訊息。
  • 在每個傳送成功之後,傳送的訊息數會加倍。
  • 傳送率會繼續加倍,直到傳送失敗、有 1000 則未解決訊息,或系統達到 10 MB 的限制為止。
  • 每次發生傳送失敗時,訂閱項目的傳送率都會減半。

請注意,這個演算法假設佇列中有足夠的發佈訊息來達到這個總處理量。 最後,推送率與發佈率密切相關。

編碼處理常式的細節取決於您的環境。以下是接收推送訊息的通訊協定範例。請注意,message.data 欄位已採用 base64 編碼

要求:

POST https://www.example.com/my-push-endpoint
{
  "message": {
    "attributes": {
      "key": "value"
    },
    "data": "SGVsbG8gQ2xvdWQgUHViL1N1YiEgSGVyZSBpcyBteSBtZXNzYWdlIQ==",
    "message_id": "136969346945"
  },
  "subscription": "projects/myproject/subscriptions/mysubscription"
}

回應:

204 No Content

會將狀態碼為 204 的回應視為隱含確認。

如需如何在 App Engine 彈性環境中完成這項工作的範例,請參閱適用於 PythonNode.jsGoRubyPHPJava寫入及回應 Cloud Pub/Sub 訊息一文。

停止與繼續傳送

如要停止 Cloud Pub/Sub 將要求傳送至推送端點,請將訂閱項目變更為提取類型。訊息將會累積,但不會傳送。 請注意,這一改變可能需要數分鐘的處理時間才會生效。

如要繼續推送傳送,請將網址再次設定為有效端點。如要永久停止傳送,請刪除訂閱項目

訊息確認期限

您可以設定推送訂閱項目的預設確認期限。 但與提取訂閱項目不同的是,無法延長個別訊息的期限。期限實際上是端點必須回應推送要求的時間長度。

設定 HTTP 端點

為了接收推送訊息,您必須有可公開存取的 HTTPS 伺服器來處理 POST 要求。這個伺服器必須提供由憑證授權單位簽署且可由 DNS 路由的有效 SSL 憑證。您也必須驗證自己的網域 (或擁有端點的相同存取權)。最後,您必須向 GCP 專案註冊端點網域。請注意,在 App Engine 中,這些步驟簡化了很多,因為 App Engine 已提供 SSL 憑證,可以放寬對驗證的要求。

您也可以使用私密憑證保護訊息安全。 如需 App Engine 範例,請參閱寫入及回應 Cloud Pub/Sub 訊息一文。

App Engine 標準端點

開始使用推送端點最簡單的方法是使用在 appspot.com 網域中託管的 App Engine 應用程式。如果應用程式與訂閱項目位於相同的 GCP 專案中,表示不需要驗證網域。 否則,您必須驗證並註冊網域 (請參閱下文)。我們建議盡可能將訂閱者與推送端點保留在相同專案中。 例如,如果您是想擴散傳遞至不同專案中多個訂閱者的發佈者,應在與推送端點相同的專案中建立訂閱項目。

以下是使用 App Engine 端點的其他一些秘訣:

  • 針對推送端點網址路徑使用前置字串 /_ah/push-handlers/

    例如:myapp.appspot.com/_ah/push-handlers/myhandler。透過加上 /_ah/push-handlers/ 前置字串,可允許端點從 Cloud Pub/Sub API 接收推送訊息。

    您不需要使用 /_ah/push-handlers/ 前置字串。但是如果您使用其他任何前置字串,則需要將它設定為允許未經驗證 (未登入) 的要求,且可透過使用例如 cURL 的工具存取。

  • 透過要求管理員登入,保護 /_ah/push-handlers/.* 網址的安全。

    這可防止未經授權就存取網址端點。如要實現這個目的,您需要像在這個 python 範例中一樣,在 app.yaml 中新增 login: admin 選項,或像在這個 Java 範例中一樣,新增 <security-constraint>

註冊端點

非 App Engine 端點,以及未在與訂閱者相同的 Cloud 專案中註冊的 App Engine 端點,需要執行下列步驟。 如要防止產生不想要的推送訊息流量,您必須建立特定網域擁有權。首先,您必須證明您擁有網域的管理權限。其次,您必須允許 GCP 專案產生該網域的流量。

步驟 1:驗證您是否擁有網域的存取權

使用 Search Console 完成網站驗證程序。 確保註冊 https:// 版本的網站網址。詳情請參閱網站驗證說明的說明文件。

步驟 2:在 API 和服務中註冊網域

除了證明您做為使用者,擁有網域 (或端點網址) 的存取權以外,也必須允許包含訂閱項目的 GCP 專案能夠存取該網域。在您完成步驟 1 之後才能執行這個步驟。在您驗證對網域的存取權之後,向專案註冊網域:

  1. 前往 Google Cloud Platform 主控台
  2. 選取專案。
  3. 開啟左上角的導覽側欄,選取 [API 和服務],然後選取 [憑證]
  4. 選取 [網域驗證]
  5. 選取 [新增網域]
  6. 填寫表單,然後再次選取 [新增網域]

這時,Google Cloud Platform 主控台會針對您在 Search Console 中驗證的網域檢查您的網域。 假設您已正確驗證網域,頁面會更新以顯示新的允許網域清單。

現在,您可以使用其中的任何網域來接收推送訊息。如要執行這項操作,您需要在建立 Cloud Pub/Sub 訂閱項目時,將這些網域設定為端點。 詳情請參閱設定訂閱項目一文。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Pub/Sub