延迟队列消息在SQS中是否算作"飞行中"?

Bra*_*yer 8 queue delay amazon-sqs amazon-web-services

我正在开展一个我打算使用Amazon SQS延迟队列的项目.

我在理解"飞行"消息的确切含义时遇到了一些麻烦.

文档中有一条说明:

注意

每个队列的机上信息数量限制为120,000.消息在队列接收后仍处于空中,但尚未从队列中删除.如果达到120,000限制,您将收到来自Amazon SQS的OverLimit错误消息.为了避免达到限制,您应该在处理完队列后删除它们.您还可以增加用于处理消息的队列数.

但我并不完全确定被队列接收的是什么.在流程图中,队列中"收到"的消息在哪里?

在此输入图像描述

我会故意延迟很多消息(在图的第一个蓝色条中),但在"可见性超时"阶段(第二个蓝色条)中并不多.

这两个蓝条都算作"机上"消息吗?或者是一条消息在被ReceiveMessage请求"接收"之后(在图表底部的"消息返回"右侧)仅"飞行" ?

Ant*_*ace 9

丢弃到延迟队列中的消息不会立即计为"在飞行中",因为它们对任何消费者都是不可见的.它们不算作"可用"或"飞行中",它们对您来说是不可见的.

您可以在AWS SQS控制台上通过简单的实验来验证这一点:

  • 创建延迟队列,并为SQS控制台打开两个选项卡.
  • 通过右键单击队列并选择"发送消息"将几条消息丢弃到延迟队列中 - 您应该注意到这些消息在延迟到期之前不会被计为"可用"或"在飞行中",此时它们会变为"可用".

正如文档所述,消息在收到后(在某些应用程序处理时)是"飞行中",但在删除之前.如果在应用程序完成它们时未删除它们,则它们将返回"可用"状态.

您可以在AWS SQS控制台上通过第二个实验对此进行验证:

  • 打开AWS SQS控制台的两个选项卡.在延迟队列中创建一些消息并等待它们变为可用.
  • 在第一个选项卡中,右键单击队列并选择"查看/删除邮件".在此实验中,"查看/删除消息"对话框类似于您的应用程序 - 它正在查看队列消息时处理它.将"消息的轮询队列"文本字段设置为足够长的持续时间并开始轮询消息.如果您的消息可用,则应立即显示.
  • 在第二个选项卡中,刷新SQS控制台.您应该注意到这些消息现在是"在飞行中",因为在您在其他选项卡中查看消息时已收到消息.

由于您的"In Flight"消息是您的应用程序当前正在处理的消息,因此该列中的队列消息深度实际上不会变得非常大.处理后删除你的消息(或重试 - >正确处理然后删除/移动到另一个队列来处理异常)你应该没事.