流量控制

本文提供如何搭配發布至主題的訊息使用流量控制的相關資訊。

關於流量控制

發布端用戶端嘗試發布訊息的速度,可能比該用戶端將資料傳送至 Pub/Sub 服務的速度更快。用戶端會受到許多因素限制,包括:

  • 電腦 CPU、RAM 和網路容量
  • 網路設定,例如待處理要求數量和可用頻寬
  • 每個發布要求的延遲時間,主要取決於 Pub/Sub 服務、用戶端和 Google Cloud

如果發布要求比率超過這些限制,要求就會累積在記憶體中,直到失敗並出現 DEADLINE_EXCEEDED 錯誤為止。如果迴圈中發布了數萬則訊息,在幾毫秒內產生數千個要求,就特別容易發生這種情況。

如要診斷這個問題,請在 Monitoring 中查看伺服器端指標。您無法查看失敗的要求 (DEADLINE_EXCEEDED),只能查看成功的要求。成功要求率可反映用戶端機器的輸送量,做為設定流量控制的基準。

前往「監控」頁面

如要緩解流量速率問題,請為發布者用戶端設定流量控制,限制發布要求速率。您可以設定為未處理要求分配的位元組數上限,以及允許的未處理訊息數上限。請根據用戶端機器的處理量容量設定這些限制。

事前準備

設定發布工作流程前,請務必先完成下列工作:

必要的角色

如要取得使用流量控管功能所需的權限,請要求管理員授予您主題的「Pub/Sub 發布者」 (roles/pubsub.publisher) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

您需要額外權限,才能建立或更新主題和訂閱項目。

搭配訊息使用流量控制

您可以使用下列語言的 Pub/Sub 用戶端程式庫,進行發布者流量控制:

C++

在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 C++ 設定操作說明進行操作。詳情請參閱 Pub/Sub C++ API 參考文件

namespace pubsub = ::google::cloud::pubsub;
using ::google::cloud::future;
using ::google::cloud::Options;
using ::google::cloud::StatusOr;
[](std::string project_id, std::string topic_id) {
  auto topic = pubsub::Topic(std::move(project_id), std::move(topic_id));
  // Configure the publisher to block if either (1) 100 or more messages, or
  // (2) messages with 100MiB worth of data have not been acknowledged by the
  // service. By default the publisher never blocks, and its capacity is only
  // limited by the system's memory.
  auto