2014-02-19 137 views
8

我正在研究一个项目,我打算使用an Amazon SQS Delay Queue在SQS中,延迟队列消息计为“在飞行中”吗?

我在理解“机上”消息的含义时有点麻烦。

有是说,文档中的说明:

注意

有120,000限制每 队列飞行信息的数量。消息在 队列收到但尚未从队列中删除后即会在飞行中。如果达到 120,000的限制,您将收到来自Amazon SQS的OverLimit错误消息。为了避免达到限制,应在队列处理后从队列中删除消息 。您还可以增加用于处理消息的队列数量 。

但我不完全确定什么被视为“被队列接收”。在流程图中,队列中的“收到”消息在哪里?

enter image description here

我将有很多故意延迟(在该图的第一蓝色条),但在“可见性超时”阶段(第二蓝色条)不是很多消息。

两个蓝色条都算作“飞行”消息吗?或者在“ReceiveMessage”请求(在图表底部的“返回消息”右侧)“接收”之后,它只是“飞行中”的消息?

回答

9

丢弃到延迟队列中的邮件不会立即计为“正在运行”,因为它们对于任何使用者都是不可见的。它们不被视为“可用”或“在飞行中”,它们只是对您不可见。

您可以使用AWS SQS控制台上的一个简单的实验验证这一点:

  • 创建一个延迟队列,并有两个选项卡中打开的SQS控制台。
  • 右键单击队列并选择“发送消息”,将几条消息拖放到延迟队列中 - 您应该注意到这些消息在延迟到期之前不会被计为“可用”或“在飞行中”点他们成为“可用”。

正如文档所述,邮件在收到(在某些应用程序正在处理它们的同时)但在删除之前是“正在运行”。如果在应用程序完成时它们没有被删除,它们将返回到“可用”状态。

您可以使用AWS SQS控制台上第二个实验中验证这一点:

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

由于您的“飞行中”消息是目前正在由您的应用程序处理的消息,因此该列中的队列消息深度不应该实际增长得非常大。在处理它们之后删除你的消息(或者重试 - >适当的处理,然后删除/移动到另一个队列来处理异常),你应该没问题。