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

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

Amazon SQS 短期和長輪詢

Amazon SQS 提供短輪詢和長輪詢,以接收來自佇列的訊息。默認情況下,佇列使用短輪詢。

使用短輪詢時,ReceiveMessage 請求只查詢伺服器的子集 (根據加權隨機分佈),以尋找可包含在回應中的訊息。即使查詢找不到任何訊息,Amazon SQS 也會立即傳送回應。

使用長輪詢時ReceiveMessage 要求會查詢所有伺服器是否有訊息。Amazon SQS 會在收集至少一個可用訊息後傳送回應,最多為請求中指定的訊息數目上限。只有在輪詢等待時間到期時,Amazon SQS 才會傳送空白回應。

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

以短輪詢消耗訊息

使用短輪詢自佇列消耗訊息時,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 等待佇列中有可用的訊息後再傳送回應,藉此減少空回應的數量。除非連線逾時,否則對 ReceiveMessage 請求的回應至少會包含一則可用的訊息,最多為 ReceiveMessage 動作中指定的訊息數量上限。在極少數情況下,即使佇列仍包含訊息,您也可能會收到空白回應,尤其是當您為 ReceiveMessageWaitTimeSeconds 參數指定較低的值時。

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

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

關於如何確認佇列是否為空,詳細資訊請參閱 確認佇列是空的

長短輪詢之間的差異

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

  • ReceiveMessage 呼叫將 WaitTimeSeconds 設為 0

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