

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

# Amazon SQS 公平佇列
<a name="sqs-fair-queues"></a>

 Amazon SQS 公平佇列會自動減輕包含來自客戶、用戶端應用程式或訊息類型等多個邏輯實體訊息的多租戶佇列中雜訊鄰近的影響。在這些共用佇列環境中，一個關鍵效能指標是駐留時間，測量訊息在佇列中從到達到處理所花費的總時間。當一個租用戶透過發佈超過系統可處理的訊息在佇列中建立待處理項目時，公平佇列會將對其他租用戶停留時間的影響降至最低。

**穩定狀態**

 下圖說明包含來自四個不同租用戶 （標記為 **A**、**B**、**C** 和 **D**) 訊息的多租用戶佇列。佇列會以穩定狀態運作，當消費者在佇列中出現訊息時，就不會收到訊息待處理項目。所有租用戶的停留時間都很短。並非所有消費者容量都會在此穩定狀態下充分利用。

![\[包含來自四個不同租用戶 （由 A、B、C、D 表示） 訊息的多租用戶佇列。佇列處於穩定狀態，在租用戶之間平均分佈傳輸中訊息，所有租用戶沒有積壓和低停留時間。\]](http://docs.aws.amazon.com/zh_tw/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/FQ1_updated_aligned.png)


**雜訊鄰近影響**

 當多租用戶佇列中的一個租用戶建立待處理項目，增加所有其他租用戶的訊息駐留時間時，就會產生雜訊鄰近影響。與其他租用戶相比，或者當消費者需要更長的時間來處理來自該特定租用戶的訊息時，租用戶可以傳送大量訊息，成為雜訊鄰。

 此圖說明**租用戶 A** 的流量增加如何在佇列中建立待處理項目。消費者正忙於處理僅**租用戶 A** 的訊息，而其他租用戶的訊息在待處理項目中等待，導致所有租用戶的停留時間增加。

![\[當租用戶 A 增加流量並在佇列中建立待處理項目時的結果。租用戶 A 的訊息在傳輸中狀態下呈現過多，其他租用戶的訊息卡在待處理項目中，導致較高的駐留時間。\]](http://docs.aws.amazon.com/zh_tw/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/FQ2_updated_again_aligned.png)


**使用公平佇列緩解**

 Amazon SQS 透過在處理期間監控租用戶之間的訊息分佈 (「傳輸中」狀態） 來偵測雜訊鄰近。當租用戶的傳輸中訊息數量不成比例時，Amazon SQS 會將該租用戶識別為雜訊鄰近，並排定其他租用戶的訊息傳遞優先順序。此方法可減少對其他租用戶的停留時間影響。

此圖說明 Amazon SQS 公平佇列如何解決雜訊鄰近問題。當一個租用戶 (**租用戶 A**) 變得嘈雜時，Amazon SQS 會優先從其他租用戶 (**B**、**C** 和 **D**) 傳回訊息。此優先順序有助於維持安靜租用戶 **B**、**C** 和 **D** 的低停留時間，而**租用戶 A** 的訊息的停留時間會提高，直到佇列待處理項目消耗而不影響其他租用戶為止。

![\[公平佇列如何透過監控傳輸中狀態來解決雜訊鄰近問題的圖例。當租用戶 A 變得嘈雜時，SQS 旨在傳回來自其他租用戶 (B、C、D) 的訊息，以便在租用戶之間平均分配傳輸中的訊息。租用戶 (B、C、D) 的駐留時間將保持低，而租用戶 A 的訊息的駐留時間將提高，直到佇列待處理項目用盡為止。\]](http://docs.aws.amazon.com/zh_tw/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/FQ3_updated_aligned.png)


**注意**  
 Amazon SQS 不會限制每個租用戶的耗用率。它可讓消費者在有消費者容量且佇列沒有要傳回的其他訊息時，接收來自雜訊鄰近租戶的訊息。如同 Amazon SQS 標準佇列，公平佇列允許幾乎無限制的輸送量，而且佇列中可以擁有的租用戶數量沒有限制。

如需 Amazon SQS 如何偵測雜訊鄰近和管理訊息傳遞順序的詳細資訊，請參閱 [Amazon SQS 公平佇列的運作方式](sqs-fair-queues-detailed.md)。

## 如何使用公平佇列
<a name="sqs-fair-queues-using-fair-queues"></a>

 若要啟用公平佇列，訊息製作者應該透過設定傳出訊息`MessageGroupId`來新增租用戶識別符：

```
// Send message with tenant identifier 
SendMessageRequest request = new SendMessageRequest()    
    .withQueueUrl(queueUrl)    
    .withMessageBody(messageBody)    
    .withMessageGroupId("tenant-123"); // Tenant identifier 
sqs.sendMessage(request);
```

 公平性功能會自動套用至具有 MessageGroupId 屬性之訊息的所有 Amazon SQS 標準佇列。它不需要對消費者程式碼進行任何變更，不會影響 API 延遲，也沒有任何輸送量限制。

**注意**  
 `MessageGroupId` 在具有公平佇列的標準佇列上，沒有與在 FIFO 佇列`MessageGroupId`上相同的行為。在標準佇列上， `MessageGroupId` 僅用於公平佇列的租戶識別符，不會強制執行訊息排序。如需 FIFO 佇列`MessageGroupId`的詳細資訊，請參閱[搭配 Amazon SQS FIFO 佇列使用訊息群組 ID](using-messagegroupid-property.md)。

## 何時使用公平佇列
<a name="sqs-fair-queues-when-to-use"></a>

當下列所有項目都適用於您的佇列時，請考慮使用公平佇列：
+ **佇列是多租戶。**佇列會承載屬於多個邏輯實體的訊息，例如客戶、用戶端應用程式或請求類型，而且您可以使用 來識別每個實體`MessageGroupId`。
+ **佇列是高輸送量。**在低輸送量下，一個租用戶的爆量很少會建立影響其他租用戶的待處理項目。在高輸送量下，過度擴展消費者機群以吸收每次爆量並不切實際，即使使用自動擴展，新消費者上線之前的延遲也可以讓積壓形成。
+ **停留時間是應用程式服務品質的一部分。**公平佇列可保護安靜租用戶免於因雜訊鄰近而增加的停留時間。如果您的應用程式對停留時間不敏感，則可能不需要雜訊鄰近的保護公平佇列。

## 公平佇列 CloudWatch 指標
<a name="sqs-fair-queues-cloudwatch-metrics"></a>

 Amazon SQS 提供額外的 CloudWatch 指標，協助您監控雜訊鄰近影響的緩解措施。例如，您可以將`Approximate..InQuietGroups`指標與標準佇列層級指標進行比較。在特定租用戶的流量激增期間，一般佇列層級指標可能會顯示不斷增加的待處理項目或較舊的訊息存留期。不過，單獨查看安靜的群組，您可以識別大多數非雜訊的訊息群組或租戶不會受到影響。

 您可以在下面找到一個範例，其中標準佇列待處理項目指標 (ApproximateNumberOfMessagesVisible) 因為有雜訊的租用戶而增加，而非雜訊租用戶的待處理項目 (ApproximateNumberOfMessagesVisibleInQuietGroups) 則保持低。

![\[圖表顯示雜訊群組的佇列待處理項目尖峰，而安靜群組則保持低。\]](http://docs.aws.amazon.com/zh_tw/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/fair_queues_cw_metrics.png)


如需 Amazon SQS CloudWatch 指標及其說明的完整清單，請參閱 [Amazon SQS 的 CloudWatch 指標](sqs-available-cloudwatch-metrics.md#sqs-metrics)。