本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
亚马逊 SQS 公平队列
对于包含来自多个逻辑实体(例如客户、客户端应用程序或消息类型)的消息的多租户队列,Amazon SQS 公平队列可自动减轻噪音邻居的影响。在这些共享队列环境中,一个关键的性能指标是停留时间,它衡量消息从到达到处理在队列中花费的总时间。当一个租户通过发布超出系统处理能力的消息在队列中创建待办事项时,公平队列可以最大限度地减少对其他租户停留时间的影响。
稳定状态
下图说明了一个多租户队列,其中包含来自四个不同租户(标记为 A、B、C 和 D)的消息。队列在稳定状态下运行,并且没有消息积压,因为消费者在消息出现在队列中后立即收到消息。所有租户的停留时间都很短。在这种稳定状态下,并非所有的消费者容量都得到充分利用。

嘈杂的邻居冲击
当多租户队列中的一个租户创建待办事项时,就会产生噪音邻居影响,从而增加所有其他租户的消息停留时间。与其他租户相比,租户发送的消息量更大,或者当消费者处理来自该特定租户的消息所需的时间更长时,租户可能会成为吵闹的邻居。
此图表说明了来自租户 A 的流量增加是如何造成队列中的待办事项的。消费者忙于处理仅来自租户 A 的消息,而来自其他租户的消息则在待办事项中等待,这导致所有租户的停留时间更长。

通过公平排队进行缓解
Amazon SQS 通过监控处理期间租户之间的消息分发(“飞行中” 状态)来检测邻居噪音。与其他租户相比,当租户收到的机上消息数量不成比例时,Amazon SQS 会将该租户识别为嘈杂的邻居,并优先考虑向其他租户传送消息。这种方法减少了停留时间对其他租户的影响。
此图说明了 Amazon SQS 公平队列是如何解决邻居噪音问题的。当一个租户(租户 A)变得嘈杂时,Amazon SQS 会优先考虑从其他租户(B 、 C 和 D)返回消息。这种优先级排序有助于为安静的租户 B、C 和 D 保持较低的停留时间,而租户 A 消息的停留时间会延长,直到队列积压的待办事项被消耗完而不会影响其他租户。

注意
Amazon SQS 不限制每个租户的消费率。当有消费者容量且队列没有其他消息可返回时,它允许消费者接收来自嘈杂的邻居租户的消息。与 Amazon SQS 标准队列一样,公平队列允许几乎无限的吞吐量,而且队列中可以拥有的租户数量没有限制。
与 FIFO 队列的区别
FIFO 队列通过限制来自每个租户的飞行中消息数量来保持严格的排序。虽然这样可以防止邻居吵闹,但它限制了每个租户的吞吐量。公平队列专为多租户场景而设计,在这些场景中,高吞吐量、低停留时间和公平的资源分配是优先事项。公平队列允许多个使用者同时处理来自同一个租户的消息,同时帮助所有租户保持一致的停留时间。
使用公平队列
您的消息制作者可以通过在外发消息MessageGroupId
上设置来添加租户标识符:
// 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 延迟没有影响,并且没有任何吞吐量限制。
公平队列 CloudWatch 指标
Amazon SQS 提供了其他 CloudWatch 指标来帮助您监控邻居噪音影响的缓解情况。例如,您可以将Approximate..InQuietGroups
指标与标准队列级别的指标进行比较。在特定租户的流量激增期间,一般队列级别的指标可能会显示积压的消息越来越长或消息时限较长。但是,孤立地观察安静的群组,你可以发现大多数非嘈杂的消息组或租户都没有受到影响。
您可以在下面找到一个示例,其中标准队列待办事项指标 (ApproximateNumberOfMessagesVisible) 因租户噪音而增加,而非嘈杂租户的积压待办事项 (ApproximateNumberOfMessagesVisibleInQuietGroups) 仍然很低。

有关亚马逊 SQS CloudWatch 指标及其描述的完整列表,请参阅亚马逊 SQ S CloudWatch 指标。