Amazon 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);
公平性功能将自动应用于所有具有 MessageGroupId 属性的消息的 Amazon SQS 标准队列。它不需要对使用者代码进行任何更改,对 API 延迟没有影响,并且没有任何吞吐量限制。
公平队列 CloudWatch 指标
Amazon SQS 提供其他 CloudWatch 指标,帮助您监控嘈杂邻居影响的缓解情况。例如,您可以将 Approximate..InQuietGroups 指标与标准队列级别的指标进行比较。在特定租户的流量激增期间,队列级别的一般指标可能会显示积压的消息增加或消息停留时间延长。但是,如果单独查看安静组,您可以发现大多数非嘈杂消息组或租户都没有受到影响。
下面是一个示例:标准队列积压指标(ApproximateNumberOfMessagesVisible)由于嘈杂租户而增加,而非嘈杂租户的积压量(ApproximateNumberOfMessagesVisibleInQuietGroups)仍然很低。
有关 Amazon SQS CloudWatch 指标及其描述的完整列表,请参阅 Amazon SQS CloudWatch 指标。