首页 > 解决方案 > 为什么即使接收/删除的指标与已发送的指标匹配,SQS ApproximateNumberOfMessagesVisible 和 ApproximateAgeOfOldestMessage 也会上升?

问题描述

在下面的 CloudWatch 指标图中,紫线是 ApproximateNumberOfMessagesVisible,红线是 ApproximateAgeOfOldestMessage。即使 NumberOfMessagesReceived(橙色)/NumberOfMessagesDeleted(绿色)与 NumberOfMessagesSent(蓝色)匹配,它们也呈上升趋势。

在此处输入图像描述

这怎么可能?

在我的代码中,我在一个新线程中处理消息,因此该消息几乎立即从队列中删除。(这在生产中不是很好的做法,但这是一个负载测试脚本,所以我不期望或关心异常)

sqsClient.receiveMessage(queueUrl).getMessages().forEach(msg -> {
    pool.execute(() -> handleSqsMessage(msg));
    sqsClient.deleteMessage(queueUrl, msg.getReceiptHandle());
});

标签: amazon-sqsamazon-cloudwatch

解决方案


如果approximateAgeOfOldestMessage 增加,则表明存在毒丸。毒丸是消费者无法处理的畸形消息。您的重新驾驶政策是什么?您必须将 max-receive-count 设置为较小的值(例如 3)。消费者收到消息 3 次后,如果无法处理/删除,则将其移至死信队列。然后你就可以分析这颗毒丸了。

如果可见消息的数量一直在增加,则表明您的消费者无法跟上,消息在队列中堆积。这不一定是一个坏信号,但不应该很大。对我来说似乎没问题。你可以增加消费者的数量来降低它。

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html#sqs-dead-letter-queues-when-to-use https://aws.amazon.com /消息队列/功能/


推荐阅读