

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

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

 对于包含来自多个逻辑实体（例如客户、客户端应用程序或消息类型）的消息的多租户队列，Amazon SQS 公平队列可自动减轻嘈杂邻居的影响。在这些共享队列环境中，一个关键的性能指标是停留时间，它衡量消息从到达到处理在队列中花费的总时间。当一个租户发布的消息数量超出系统处理能力，导致队列中出现积压情况时，公平队列可以最大限度地减轻对其他租户停留时间的影响。

**稳定状态**

 下图展示了一个多租户队列，其中包含来自四个不同租户（标记为 **A**、**B**、**C** 和 **D**）的消息。队列在稳定状态下运行，并且没有消息积压，因为使用者在消息出现在队列中后立即收到消息。所有租户的停留时间都很短。在这种稳定状态下，并非所有的使用者容量都得到充分利用。

![\[包含来自四个不同租户（由 A、B、C、D 表示）的消息的多租户队列。队列处于稳定状态，传输中消息在租户之间均匀分布，没有积压，所有租户的停留时间也很短。\]](http://docs.aws.amazon.com/zh_cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/FQ1_updated_aligned.png)


**嘈杂邻居影响**

 当多租户队列中的一个租户出现积压情况时，就会产生嘈杂邻居影响，导致其他所有租户的消息停留时间增加。租户可能会因发送的消息量超过其他租户而成为嘈杂邻居，或者当使用者处理来自该特定租户的消息耗时更长时，租户也可能会成为嘈杂邻居。

 此图展示了来自**租户 A** 的流量增加是如何导致队列出现积压的。使用者忙于处理仅来自**租户 A** 的消息，而来自其他租户的消息则积压在队列中，导致所有租户的停留时间延长。

![\[当租户 A 增加流量并导致队列出现积压时的结果。租户 A 的消息在传输中状态下的占比过高，而来自其他租户的消息则积压在队列中，导致停留时间更长。\]](http://docs.aws.amazon.com/zh_cn/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_cn/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`上设置 a 来添加租户标识符：

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

 公平性功能将自动应用于所有 Amazon SQS 标准队列中，用于处理带有该 MessageGroupId 属性的消息。它不需要对使用者代码进行任何更改，对 API 延迟没有影响，并且没有任何吞吐量限制。

**注意**  
 `MessageGroupId`在具有公平队列的标准队列上，其行为与`MessageGroupId`在 FIFO 队列上的行为不同。在标准队列上，`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_cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/fair_queues_cw_metrics.png)


有关亚马逊 SQS CloudWatch 指标及其描述的完整列表，请参阅亚马逊 SQ [S CloudWatch 指标](sqs-available-cloudwatch-metrics.md#sqs-metrics)。