Amazon SQS:两个当前消费者使用相同的消息

Posted

技术标签:

【中文标题】Amazon SQS:两个当前消费者使用相同的消息【英文标题】:Amazon SQS: The same message is consumed by two current consumers 【发布时间】:2016-07-01 14:22:17 【问题描述】:

我有四个当前消费者在 Amazon AWS 上收听同一个队列。当从队列中拉出消息时,有时会出现相同的消息被两个不同的消费者消费。请看下面的日志:

18:01:46,515 [jmsContainer-2] 调试 - 收到来自队列的消息:ID:3698a927-930b-4d6a-aeca-f66922528792

18:02:12,825 [jmsContainer-3] 调试 - 收到来自队列的消息:ID:3698a927-930b-4d6a-aeca-f66922528792

我有一个具有 4 个并发使用者的 JMS 容器设置。我将可见性超时设置为 30 秒。

既然消息被container2收到了,那container3怎么还能访问呢?

JMS 容器是否在执行侦听器方法(handleMessage)之前或之后进行自动确认?

【问题讨论】:

Using many consumers in SQS Queue的可能重复 【参考方案1】:

亚马逊不保证使用 SQS 准确交付一次。他们保证“至少一次”交付。常见问题解答https://aws.amazon.com/sqs/faqs/

中解决了这个问题

您必须牢记这一点,并设计您的系统以优雅地处理重复的消息传递。

【讨论】:

从技术上讲确实如此,但我发现它非常很少见。例子应该很难找到。问题通常不是 SQS,而是用户组件重置可见性超时。 感谢您的解释。这实际上对我来说经常发生,而且我的应用程序代码中没有重置可见性超时。 如果消息的处理时间超过消息的不可见超时时间,则消息将重新出现在队列中并可供其他工作人员读取。这是重复消息的最常见原因。 @garnaat,但默认情况下,JMS 容器启用了自动确认,这意味着消息将在调用处理消息方法后立即被确认。如果我是正确的,那么 SQS 不必等到客户端处理完消息后才能删除消息。 如果 acknowledged 您的意思是从队列中删除,那么您是正确的。但是我当然希望消息的处理不会失败,因为它不会出现在重新处理队列中。【参考方案2】:

现在这可以通过 FIFO SQS 队列实现。您可以确保只有一个客户端接收到消息,然后在消息传输过程中将其删除

更多信息在这里:

https://aws.amazon.com/about-aws/whats-new/2016/11/amazon-sqs-introduces-fifo-queues-with-exactly-once-processing-and-lower-prices-for-standard-queues/

【讨论】:

以上是关于Amazon SQS:两个当前消费者使用相同的消息的主要内容,如果未能解决你的问题,请参考以下文章

在 SQS 队列中使用多个消费者

Amazon SQS/SNS 策略错误

Amazon SQS 可见性超时

如何将Amazon SQS与Dynamodb集成

Amazon Elastic Beanstalk Worker cronjob (SQS) 多次触发同一消息

Amazon SQS 消息多路传送