Amazon SQS 短期和長輪詢 - Amazon Simple Queue Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Amazon SQS 短期和長輪詢

Amazon SQS 提供從佇列接收訊息的短期和長輪詢選項。在這兩個輪詢選項之間進行選擇時,請考慮應用程式對回應速度和成本效益的需求:

  • 短輪詢 (預設值) — ReceiveMessage要求會查詢伺服器子集 (根據加權隨機分佈) 以尋找可用的訊息並傳送立即回應,即使找不到訊息也一樣。

  • 長輪ReceiveMessage詢 — 查詢所有伺服器是否有訊息,至少傳送一則訊息一次回應,最多達到指定的最大值。只有在輪詢等待時間到期時,才會傳送空白回應。此選項可減少空白回覆的數量,並可能降低成本。

以下各節說明短輪詢和長輪詢的詳細資訊。

以短輪詢消耗訊息

當您使用短輪詢使用佇列 (FIFO 或標準) 中的訊息時,Amazon SQS 會針對其伺服器子集 (根據加權隨機分配) 取樣,並僅從這些伺服器傳回訊息。因此,特定的 ReceiveMessage 請求可能不會傳回您的所有訊息。但是,若佇列中的訊息少於 1,000 則,後續的請求就會將訊息傳回。如果您持續自佇列消耗訊息,Amazon SQS 便會對其所有伺服器進行採樣,以致您將收到全部的訊息。

下圖為系統元件之一在提出接收請求後,從標準佇列傳回訊息的短輪詢行為。Amazon SQS 會對其若干伺服器 (顯示為灰色) 進行採樣,再從這幾個伺服器傳回訊息 A、C、D 和 B。此次的請求並不會傳回訊息 E,但後續的請求會將其傳回。

使用短 (標準) 輪詢的訊息取樣

以長輪詢消耗訊息

ReceiveMessage API 動作的等待時間大於 0 時,長輪詢就會生效。最長輪詢等待時間上限為 20 秒。長輪詢可減少空回應 (沒有 ReceiveMessage 請求可用的訊息) 和 False 空回應 (有可用訊息但不包含在回應中) 的數目,藉以降低使用 Amazon SQS 的成本。如需使用 Amazon SQS 主控台為新佇列或現有佇列啟用長輪詢的相關資訊,請參閱。使用 Amazon SQS 主控台設定佇列參數如需最佳實務做法,請參閱「在 Amazon SQS 中設置長輪詢」。

長輪詢可提供下列好處:

  • 允許 Amazon SQS 等待佇列中有可用的訊息後再傳送回應,藉此減少空回應的數量。除非連線逾時,否則對 ReceiveMessage 請求的回應至少會包含一則可用的訊息,最多為 ReceiveMessage 動作中指定的訊息數量上限。在極少數情況下,即使佇列仍包含訊息,您也可能會收到空白回應,尤其是當您為ReceiveMessageWaitTimeSeconds參數指定較低的值時。

  • 透過查詢所有 Amazon SQS 伺服器 (而非子集) 來減少錯誤的空白回應。

  • 訊息一旦可供使用時,立即傳回訊息。

如需如何確認佇列是否為空的資訊,請參閱確認 Amazon SQS 佇列是空的

長短輪詢之間的差異

WaitTimeSeconds 請求的 ReceiveMessage 參數以兩種方式之一設為 0 時,便會發生短輪詢:

  • ReceiveMessage 呼叫將 WaitTimeSeconds 設為 0

  • ReceiveMessage 呼叫未設定 WaitTimeSeconds,但佇列屬性 ReceiveMessageWaitTimeSeconds 設為 0