建立發送佇列

本頁說明如何建立和自訂發送佇列,以及如何檢查佇列的內容。

使用 queue.xml 建立佇列

如要處理工作,您必須將其新增至發送佇列。App Engine 提供一個名為 default 的預設發送佇列,這個佇列已設定好,隨時可以配合預設設定一起運用。您可以視需要將所有工作新增至預設佇列,而無需建立和設定其他佇列。

如要新增佇列或變更預設設定,請編輯您上傳至 App Engine 的應用程式 queue.xml 檔案。您可以為免費的應用程式最多建立 10 個佇列,已啟用計費功能的應用程式則最多為 100 個佇列。您無法以動態方式建立佇列。

這個 queue.xml 檔案可以定義兩種佇列:

<?xml version="1.0" encoding="UTF-8"?>
  <queue-entries>
    <queue>
      <name>queue-blue</name>
      <target>v2.task-module</target>
    </queue>
    <queue>
      <name>queue-red</name>
      <rate>1/s</rate>
    </queue>
  </queue-entries>
您可以使用 App Engine SDK 上傳檔案。

Mac/Linux

[PATH_TO_APP_ENGINE_SDK]\bin\appcfg.sh update [YOUR_APP_DIR]

Windows

[PATH_TO_APP_ENGINE_SDK]\bin\appcfg.cmd update [YOUR_APP_DIR]

新增至 queue-blue 的所有工作都會傳送至目標模組 v2.task-modulequeue-red 的重新整理頻率會從每秒 5 次變更為每秒 1 次。工作將會從佇列中移除,並以每秒 1 項工作的速率傳送至其目標。

如果您刪除某個佇列,將必須等待 7 天左右才能再建立相同名稱的新佇列。

您還可以將許多其他參數新增至 queue.xml 檔案,以自訂發送佇列的行為。詳情請參閱 queue.xml 參考資料

定義發送佇列處理速率

您可以透過定義其他指令 (例如 <rate><bucket-size><max-concurrent-requests>) 來控制每個佇列的工作處理速率。

工作佇列會使用憑證區塊來控制工作執行的速率。每個已命名的佇列都有憑證區塊,其中所含的憑證最多可達 bucket_size 指定的上限,如果您未指定區塊大小,則最多可以含有 5 個憑證。

每次應用程式執行一項工作時,系統就會從區塊中移除一個憑證。應用程式會不斷地處理佇列中的工作,直到佇列的區塊中再也沒有憑證為止。App Engine 會依據您為佇列指定的 <rate>,持續在區塊中補充新的憑證。

如果佇列含有待處理的工作,且佇列的區塊中含有憑證,則 App Engine 會同時處理與憑證數量相同的工作。但是,這樣可能會導致處理作業暴增,不僅耗用系統資源,也會與其他服務使用者的要求產生競爭。

如要防止一次執行太多工作,或防止資料儲存庫發生爭用情況,請使用 <max-concurrent-requests>

以下範例會說明如何設定 <max-concurrent-requests> 以限制工作,以及如何根據應用程式的需求和可用資源來調整區塊大小和速率:

<?xml version="1.0" encoding="UTF-8"?>
<queue-entries>
  <queue>
    <name>queue-blue</name>
    <rate>20/s</rate>
    <bucket-size>40</bucket-size>
    <max-concurrent-requests>10</max-concurrent-requests>
  </queue>
</queue-entries>

設定所有佇列的儲存空間限制

您可以使用 queue.xml 來定義工作資料可以在所有佇列中佔用的總儲存空間量。如要定義總儲存空間限制,請在頂層加入名為 <total-storage-limit> 的元素:

<?xml version="1.0" encoding="UTF-8"?>
<queue-entries>
  <total-storage-limit>120M</total-storage-limit>
  <queue>
    <name>queue-blue</name>
    <rate>35/s</rate>
  </queue>
</queue-entries>

這個值是數字加上單位:B 代表位元組,K 代表 KB,M 代表 MB,G 代表 GB,T 則代表 TB。舉例來說,100K 指定的限制是 100 KB。如果新增工作會導致佇列超出其儲存空間限制,則新增工作的呼叫將會失敗。免費應用程式的預設限制是 500M (500 MB)。除非您明確設定,否則付費應用程式沒有限制。您可以運用這項限制來保護應用程式,避免發生 fork 炸彈程式設計錯誤 (讓每項工作在執行期間新增多項其他工作)。

如果應用程式在新增工作時收到配額不足的錯誤訊息,提高總儲存空間限制可能會有所幫助。如果您使用這項功能,強烈建議您根據執行數天工作所需的儲存空間來設定限制。如此可以暫時備份佇列,並在處理待處理作業時繼續接受新工作,同時仍然可以防止發生 fork 炸彈程式設計錯誤。

設定並行要求的數量上限

您可以透過設定 <max-concurrent-requests> 來進一步控制處理速率,從而限制可以同時執行的工作數量。

如果您的應用程式佇列速率為每秒 20 項工作,而值區大小為 40,則該佇列中的工作會以每秒 20 項的速率執行,但也可能瞬間飆升至每秒 40 項。當工作延遲時間相對而言還比較低時,這些設定尚可正常運作;然而,如果延遲時間大幅增長,最後您的應用程式就必須處理大幅增加的並行工作量。這種額外的處理負載可能會耗用額外的執行個體,並拖慢您的應用程式。

例如,假設您的正常工作延遲時間是 0.3 秒,此時您最多同時處理約 40 項工作。但是,如果您的工作延遲時間增加至 5 秒,很容易就會出現同時處理超過 100 項工作的情形。工作量的增加會迫使您的應用程式耗用更多執行個體來處理額外的工作,無形中拖慢了整個應用程式,並且也干擾到使用者的要求。

您可以透過將 <max-concurrent-requests> 設定為較低的值來避免可能發生這種情形。例如,如果您將 <max-concurrent-requests> 設定為 10,則當延遲時間為 0.3 秒時,我們的範例佇列將會維持大約每秒處理 20 項工作。不過,當延遲時間增加到超過 0.5 秒時,這項設定就會限制處理速率,以確保同時執行的工作不致超過 10 項。

<?xml version="1.0" encoding="utf-8"?>
<queue-entries>
  <queue>
    <name>optimize-queue</name>
    <rate>20/s</rate>
    <bucket-size>40</bucket-size>
    <max-concurrent-requests>10</max-concurrent-requests>
  </queue>
</queue-entries>

在 GCP 主控台中監控佇列

GCP 主控台的「工作佇列」頁面會顯示應用程式中所有工作佇列的相關資訊。

  1. 請造訪 GCP 主控台的「工作佇列」頁面,然後在頁面頂端的選單列中選取 [發送佇列] 分頁標籤。

    前往發送佇列分頁

  2. 「發送佇列」分頁會列出應用程式中的所有佇列。按一下佇列名稱會顯示「工作佇列詳細資料」頁面,您可以在其中查看所選佇列中的所有工作。

後續步驟

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

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

這個網頁
Java 適用的 App Engine 標準環境