AWS SQS 接收消息 -- 如何知道队列为空

3
2个回答

5
当您从队列中接收消息时,它们被标记为“in flight”。 在成功处理它们后,您会向队列发送调用以删除它们。此调用将包括每个消息的ID。
当队列为空时,下一次读取将具有空的Messages数组。
通常情况下,当我这样做时,我会将对队列的读取调用包装在一个循环(while循环)中,并且只有在执行读取后有Messages时才继续处理。
如果它是FIFO队列还是标准队列都不会有任何区别。

3
当仍有消息可用时,我收到了一个空列表。AWS文档中指出:“Amazon SQS从不返回超过此值[max no. messages]的消息(但是可能会返回较少的消息)。”你是否有这方面的经验? - undefined
这是不正确的,没有收到消息并不一定意味着队列是空的。请查看我的答案以获取更多详细信息。 - undefined

1
要检查队列是否为空,您需要验证队列中的消息总数是否为零。SQS没有提供单个度量标准来实现这一点,而是需要计算三个不同度量标准的总和。
从文档中可以看到:
确认队列是否为空(AWS CLI,AWS API):
1. 停止所有生产者发送消息。 2. 重复运行以下命令之一: - AWS CLI: get-queue-attributes - AWS API: GetQueueAttributes 3. 观察以下属性的指标: - ApproximateNumberOfMessagesDelayed - ApproximateNumberOfMessagesNotVisible - ApproximateNumberOfMessages 4. 当它们全部为0并持续数分钟时,队列为空。

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/confirm-queue-is-empty.html

ReceiveMessage调用中获取空响应并不一定意味着队列为空。如果:

  1. 消息被延迟 - 您可以为标准队列上的单个消息或者针对标准和FIFO队列设置延迟。在延迟期间,消费者无法看到这些消息。
  2. 消息正在传输中 - 当消费者接收到消息时,该消息会一直保留在队列中,直到消费者通过调用DeleteMessage将其删除。在此状态下,该消息被视为正在传输中,其他消费者无法使用它。
  3. 在FIFO队列中有多个具有相同消息组ID的消息 - 当消费者从FIFO队列接收消息时,没有其他消费者可以从同一消息组接收消息。这确保了按照先进先出的顺序处理消息。

通过总结上述指标,您可以考虑所有这些情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接