本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
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
。