Java 使用Amazon SQS的多个消费者

Java 使用Amazon SQS的多个消费者,java,amazon-web-services,amazon-sqs,amazon-sns,Java,Amazon Web Services,Amazon Sqs,Amazon Sns,我用java编写我所有的微服务。我想在AmazonSQS中使用多个使用者,但每个使用者在AWS上的负载平衡器后面都有多个实例 我使用SNS作为输入流 我在SNS之后使用SQS标准队列 我在stackoverflow上发现了同样的问题 这个样本是 当我阅读SQS标准队列文档时,我发现有时会传递多个消息副本: 每条消息都有一个消息id。如何检测同一个微服务没有多个实例会处理同一条消息,该消息会被发送多次。我是通过在dynamodb数据库中注册message_id得到一个主意的,但是如果这是由同一个m

我用java编写我所有的微服务。我想在AmazonSQS中使用多个使用者,但每个使用者在AWS上的负载平衡器后面都有多个实例

我使用SNS作为输入流

我在SNS之后使用SQS标准队列

我在stackoverflow上发现了同样的问题

这个样本是

当我阅读SQS标准队列文档时,我发现有时会传递多个消息副本:

每条消息都有一个消息id。如何检测同一个微服务没有多个实例会处理同一条消息,该消息会被发送多次。我是通过在dynamodb数据库中注册message_id得到一个主意的,但是如果这是由同一个micro服务的多个实例完成的,那么如何在get上设置一个类似于SELECT FOR UPDATE的锁呢


例如,同一微服务扫描元数据的多个实例。

如您所述,标准SQS队列有时可以多次传递相同的消息。这是由于SQS服务的分布式性质造成的。每个消息都存储在多个服务器上以实现冗余,当您调用sqs:DeleteMessage时,其中一个服务器发生故障,因此不会从所有服务器上删除该消息,一旦出现故障的服务器重新联机,它不知道您已删除该邮件,并将再次处理该邮件

解决重复消息问题的最简单方法是切换到使用FIFO队列,它为您提供一次处理。您可以根据发件人生成的内容或唯一ID选择使用重复数据消除。如果选择使用内容重复数据消除,当队列在5分钟内收到两封内容相同的邮件时,重复数据消除间隔将丢弃该邮件

如果两条消息可以具有相同的内容,但您需要将它们视为不同的消息,则可以使用基于ID的重复数据消除,该ID可以通过MessageDeduplicationId参数传递给sqs:SendMessage或sqs:SendMessageBatch调用


在考虑使用DynamoDB存储消息处理状态之前,我肯定会先检查FIFO队列。这将更便宜,而且默认情况下,此重复数据消除功能为您提供,您无需实施任何复杂的逻辑。

此外,根据使用情况,偶尔的消息复制实际上也可以。例如,如果图像大小调整两次,则会浪费一点处理能力,但这可能比重复数据消除便宜。重要提示:Amazon SNS目前与FIFO队列不兼容。我不知道这个限制。在这种情况下,我仍然会使用FIFO队列,但不是使用SNS扇出这些消息,我可能会在应用程序中这样做-调用多个sqs:SendMessages,每个sqs端点一个。@MatusDubrava,如果我仍然使用FIFO队列,而不是使用SNS部署这些消息,我可能会在应用程序中通过调用多个SQ来实现这一点,我的微服务之间会有一个强大的链接。使用队列的目的正是为了消除微服务之间的强耦合。我写道,我在SNS之后使用SQS标准队列,在前面的两个模式中,很明显是SNS作为入口点