正确计算发送到死信 SQS 队列的消息数

Posted

技术标签:

【中文标题】正确计算发送到死信 SQS 队列的消息数【英文标题】:Correctly calculate number of sent messages to Dead Letter SQS queue 【发布时间】:2019-10-10 00:10:09 【问题描述】:

我希望 grafana 在任何给定时间报告死信队列中有多少消息。由于最终进入此队列的性质,最终进入此队列的消息将被评估和解析。

我已将 grafana 配置为从 dead-letter 队列中读取 NumberOfMessagesSent,但是该值始终为 0,因为;我认为最终到达这里的消息是从另一个队列(通过 SQS)发送的。

即使我可以看到消息已发送到 dead-letter 队列(不是以编程方式),而是通过在 X 次接收后配置的另一个队列。

有解决办法吗?

【问题讨论】:

有趣! CloudWatch 将NumberOfMessagesSent 定义为“添加到队列中的消息数”。我猜移动到 DLQ 不会被归类为“添加到队列”? 好像是这样。 【参考方案1】:

快速回答:

您可以在 SQS DLQ 上真正监控的唯一指标是 ApproximateNumberOfMessagesVisible

TLDR:

当新消息到达 SQS DLQ 时,NumberOfMessagesSentNumberOfMessagesReceived 都不会增加。 来自AWS Documentation的引用:

如果您手动将消息发送到死信队列,则会被捕获 由 NumberOfMessagesSent 指标。但是,如果将消息发送到 由于处理尝试失败而导致的死信队列,它不是 由该指标捕获。因此,有可能的值 NumberOfMessagesSent 和 NumberOfMessagesReceived 不同。

NumberOfMessagesSent 表示:

您已发送到队列的消息数量(由于失败而到达 DLQ 的消息除外)

NumberOfMessagesReceived 表示:

您从队列中收到了多少条消息

ApproximateNumberOfMessagesVisible 表示:

队列中可见的总数或消息。 (请记住,当您从队列接收消息时,您必须设置可见性超时==您收到的消息有多长时间不对其他人可见。还请记住,您应该在成功处理后删除消息,否则它将在可见性超时后对其他人可用。 )

【讨论】:

【参考方案2】:

由于 NumberOfMessagesReceived 和 NumberOfMessagesSent 的指标取决于 David Navrkal 提到的消息的排队方式,因此我使用指标 ApproximateNumberOfMessagesDelayed 为我们的需求设计了一个新的解决方案。在 dlq 设置中,我添加了使用此指标的延迟。

ie: DelaySeconds: 60 #用于警报

对于 yaml,请参阅 Configure SQS Dead letter Queue to raise a cloud watch alarm on receiving a message。

【讨论】:

以上是关于正确计算发送到死信 SQS 队列的消息数的主要内容,如果未能解决你的问题,请参考以下文章

AWS SQS:当消费者发生错误时移动到死信队列

配置 SQS 死信队列以在收到消息时引发云监视警报

使用RabbitMQ处理死信队列

Amazon SQS 死信队列:真的是死信还是毒药?

Azure SB 队列将消息发送到禁用的死信队列

RocketMQ的死信队列