

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

# Amazon SQS 短輪詢和長輪詢
<a name="sqs-short-and-long-polling"></a>

Amazon SQS 提供短期和長期輪詢選項，用於從佇列接收訊息。在這兩個輪詢選項之間進行選擇時，請考慮應用程式對回應能力和成本效益的需求：
+ **短輪詢 **（預設） – [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html)請求會查詢伺服器子集 （根據加權隨機分佈），以尋找可用的訊息並傳送立即回應，即使找不到任何訊息。
+ **長輪詢** – [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html) 查詢所有伺服器是否有訊息，在至少一個訊息可用時傳送回應，最高可達指定的上限。只有在輪詢等待時間過期時，才會傳送空白回應。此選項可以減少空回應的數量，並可能降低成本。

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

## 以短輪詢消耗訊息
<a name="sqs-short-polling"></a>

當您使用短輪詢從佇列 (FIFO 或標準） 取用訊息時，Amazon SQS 會取樣其伺服器子集 （根據加權隨機分佈），並僅傳回來自這些伺服器的訊息。因此，特定的 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html) 請求可能不會傳回您的所有訊息。但是，若佇列中的訊息少於 1,000 則，後續的請求就會將訊息傳回。如果您持續自佇列消耗訊息，Amazon SQS 便會對其所有伺服器進行採樣，以致您將收到全部的訊息。

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

![\[使用短 （標準） 輪詢進行訊息取樣\]](http://docs.aws.amazon.com/zh_tw/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/ArchOverview_Receive.png)


## 以長輪詢消耗訊息
<a name="sqs-long-polling"></a>

當 `[ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html)` API 動作的等待時間大於 0 時，*長輪詢*就會生效。最長輪詢等待時間上限為 20 秒。長輪詢透過減少空回應數量 （當請求沒有可用的訊息時`ReceiveMessage`) 和錯誤空回應 （當訊息可用但未包含在回應中時），協助降低使用 Amazon SQS 的成本。如需有關使用 Amazon SQS 主控台為新的或現有的佇列啟用長輪詢的資訊，請參閱 [使用 Amazon SQS 主控台設定佇列參數](sqs-configure-queue-parameters.md)。如需最佳實務做法，請參閱「[在 Amazon SQS 中設定長輪詢](best-practices-setting-up-long-polling.md)」。

長輪詢提供下列優點：
+ 允許 Amazon SQS 等待佇列中有可用的訊息後再傳送回應，藉此減少空回應的數量。除非連線逾時，否則對 `ReceiveMessage` 請求的回應至少會包含一則可用的訊息，最多為 `ReceiveMessage` 動作中指定的訊息數量上限。在極少數情況下，即使佇列仍包含訊息，您可能會收到空白回應，特別是當您為 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html#SQS-ReceiveMessage-request-WaitTimeSeconds](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html#SQS-ReceiveMessage-request-WaitTimeSeconds) 參數指定較低的值時。
+ 透過查詢所有 - 而非一部分的 Amazon SQS 伺服器來減少誤報。
+ 訊息一旦可供使用時，立即傳回訊息。

如需如何確認佇列是否為空的資訊，請參閱 [確認 Amazon SQS 佇列是空的](confirm-queue-is-empty.md)。

## 長短輪詢之間的差異
<a name="sqs-short-long-polling-differences"></a>

當 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html#SQS-ReceiveMessage-request-WaitTimeSeconds](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html#SQS-ReceiveMessage-request-WaitTimeSeconds) 請求的 `[ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html)` 參數以兩種方式之一設為 `0` 時，便會發生短輪詢：
+ `ReceiveMessage` 呼叫將 `WaitTimeSeconds` 設為 `0`。
+ `ReceiveMessage` 呼叫未設定 `WaitTimeSeconds`，但佇列屬性 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html) 設為 `0`。