

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

# 亚马逊 SQS 公平队列是如何运作的
<a name="sqs-fair-queues-detailed"></a>

 Amazon SQS 公平队列可防止单个租户减慢其他租户的消息处理速度，从而自动减轻多租户队列中邻居噪音的影响。当公平队列检测到一个租户在队列的使用者容量中占用了不成比例的份额时，他们会优先考虑来自安静租户的消息传送。

## 租户识别
<a name="sqs-fair-queues-tenant-identification"></a>

公平队列在每条消息上按`MessageGroupId`房产识别租户。共享相同内容的消息`MessageGroupId`属于同一个租户。公平队列可以包含带有和不带的混合消息`MessageGroupId`。不带的每条消息`MessageGroupId`都被视为属于其自己的不同租户。

我们建议您使用映射到系统中真实实体的标识符（例如客户 ID、客户端应用程序 ID 或请求类型）对发送到公平队列的每条消息都设置一个。`MessageGroupId`

## 检测的工作原理
<a name="sqs-fair-queues-detection"></a>

Amazon SQS 使用两种衡量标准来检测邻居吵闹的声音：
+ **并发份额** — 租户的飞行中消息占队列中所有飞行中消息的一小部分。这可以检测出同时处理多条消息的租户，无论是由于发送量大、处理速度慢还是两者兼而有之。
+ **处理时间份额** — 租户最近在消费者处理总时间中所占的份额。它可以检测到消息数量很少但处理速度较慢的租户，因此租户会占用大量的消费者时间，而不会同时传输很多消息。

当以下任一条件为真时，租户将被标记为吵闹的邻居：
+ **并发份额**：租户占队列中传输中消息的10％以上，并且至少有30条自己的消息正在传输中。
+ **处理时间份额**：租户最近在消费者处理总时间中所占的份额超过 10%。

由于 Amazon SQS 是一个分布式系统，因此这些阈值是近似值，检测可能无法在所描述的确切值下激活。

## 留言传送顺序如何变化
<a name="sqs-fair-queues-delivery-order"></a>

一旦租户被检测为吵闹的邻居，Amazon SQS 就会优先发送来自安静租户的消息。每当有静默租户消息可用时，轮询消息的使用者实例就会收到来自安静租户的消息。这种优先级划分一直持续到吵闹的邻居的并发份额和处理时间份额下降到与安静的租户相当的水平。

嘈杂的邻居消息不会被丢弃或限制。他们的停留时间会增加，而安静的租户消息会被优先排序，待处理的消息清理完毕后就会恢复正常。当没有静默租户消息在等待时，使用者实例会像往常一样收到嘈杂的邻居消息。

如果同时检测到多个租户是嘈杂的邻居，则消费者实例会首先从嘈杂的租户那里收到消息，其中飞行中消息最少。这有助于在嘈杂的租户之间平衡处理时间。

## 当吵闹的邻居变得安静时
<a name="sqs-fair-queues-quiet-removal"></a>

当满足以下任一条件时，租户不再被视为吵闹的邻居：
+ 租户的待办事项已全部用完。
+ 在连续 5 分钟内，租户没有发送任何消息。

之后，租户的消息将不再被取消优先级，其处理方式与来自任何其他安静租户的消息相同。

## 消费者容量注意事项
<a name="sqs-fair-queues-consumer-capacity"></a>

为了使并发共享衡量标准有效地发挥作用，您的消费者需要同时处理足够的消息，这样一个租户在飞行中消息中所占份额才能脱颖而出。在调整消费者车队规模时，请考虑这一点。

通过事件源映射将 Lambda 用作使用者时，传输中消息的数量取决于 Lambda 函数并发性和批处理大小。在调整消费者规模时，请同时评估这些设置。

当传输中的消息数量太低而无法触发并发共享阈值时，处理时间共享度量仍然可以检测到有噪音的邻居。但是，当消费者同时处理足够多的消息以供评估这两种衡量标准时，公平队列效果最好。