如何让多个消费者从单个AWS SQS队列接收相同的消息?

问题描述 投票:0回答:1

我有一个订阅 SNS 主题的 AWS SQS 队列。队列当前有两个消费者:

  1. 使用 io.awspring.cloud.sqs.annotation 包中的 @SqsListener 的 Java 类。
  2. EventBridge 管道配置为使用相同的 SQS 队列作为其源。

(使用 terraform、Java)

问题在于,在任何给定时间,只有其中一个消费者从队列接收消息。据我了解,SQS 旨在将每条消息仅传递给一个消费者。但是,我希望两个消费者独立处理同一条消息。

问题:

  1. 有没有办法配置SQS、EventBridge管道或@SqsListener以允许两个消费者独立接收相同的消息?
  2. 如果没有,以最少的更改和只有一个 SQS 队列来实现这一目标的最佳架构解决方法是什么?

代码:

    @SqsListener("${app.consumer.shopper-order.queue}")
    public void listen(String message) throws JsonProcessingException {
      // do stuff
    }

任何帮助或指导将不胜感激!

amazon-web-services amazon-sqs terraform-provider-aws aws-event-bridge sqslistener
1个回答
0
投票

正确的架构是:

  • 将消息发送到 Amazon SNS 主题
  • 将两个 Amazon SQS 队列订阅到 SNS 主题

这样,每条消息都会发送到两个队列,每个消费者都可以按照自己的节奏独立消费消息。将来添加额外的消费者就很容易了。

请参阅:将 Amazon SNS 通知扇出到 Amazon SQS 队列以进行异步处理 - Amazon Simple Notification Service

或者,将消息发送到 Amazon Kinesis 流,并让使用者从流中提取消息。多个消费者可以从同一个流中读取数据,每个消费者都有自己的“当前指针”。他们还可以重播消息,而不是在消费后删除消息。

从 SQS 队列消费比从 Kinesis 流消费更容易(也更便宜)。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.