当前位置: 首页 > 知识库问答 >
问题:

与多个消费者一起使用Amazon SQS

郭云
2023-03-14

我有一个基于服务的应用程序,它使用Amazon SQS,具有多个队列和多个消费者。我这样做是为了实现一个基于事件的架构,并解耦所有服务,其中不同的服务对其他系统状态的变化做出反应。例如:

  • 注册服务:
    • 当新用户注册时,发出事件“registration new”
    • 在用户更新时发出事件'user-更新'。
    • 从队列“registration new”(注册新)中读取,并为搜索中的用户编制索引
    • 从“注册-新建”队列中读取并发送到MixPanel。
    • 从队列“用户更新”中读取并发送到混合面板。

    我有很多问题:

    • 在进行轮询时可以多次接收消息。我可以将很多系统设计为幂等的,但对于某些服务(例如metrics服务),这将更加困难。
    • 需要从SQS中的队列中手动删除一条消息。我想实现一个“消息处理服务”,当所有服务都收到消息时处理消息的删除(每个服务在处理消息后会发出一个“消息确认”事件)。

    我想我的问题是:我应该使用什么模式来确保我可以在SQS中为单个队列拥有多个消费者,同时确保消息也能可靠地传递和删除。谢谢你的帮助。

共有3个答案

邓翼
2023-03-14

他们甚至有一个关于如何使用组合SNS SQS创建扇出场景的教程。

https://aws.amazon.com/getting-started/tutorials/send-fanout-event-notifications/

可惜它不支持FIFO队列,因此您必须小心处理乱序消息。

如果他们有一个一致的散列解决方案,在尊重消息顺序的同时拥有多个竞争消费者,那就太好了。

田权
2023-03-14

队列的多个消费者的主要用例是向外扩展。

允许多个使用者的机制是可见性超时,它为使用者提供了处理和删除消息的时间,而不会被另一个使用者同时使用。

为了解决标准队列的“至少一次传递”属性,消费服务应该是idemptotent。如果这不可能,一种可能的解决方案是使用FIFO队列,但这种模式的消息传递速率有限,并且与SNS订阅不兼容。

尉迟高澹
2023-03-14

我认为你做错了。

在我看来,您使用同一个队列来执行多个不同的操作。您最好将单个队列用于单个目的。

而不是将一个事件放入注册-新建队列,然后让两个不同的服务轮询该队列,并且两者都需要读取该消息,并且都对其执行不同的操作(然后需要第三个进程,该进程应该在其他两个处理后删除该消息)。

一个队列应该用于一个目的。

>

mixpanel服务从mix panels队列中读取、处理消息并删除消息。

注册服务不再向单个队列发送“新注册”,而是将其发送到两个队列。

为了更进一步,将SNS添加到这里的混合中,让注册服务向“注册新”主题(而不是队列)发出SNS消息,然后以“扇出”模式将我上面提到的两个队列订阅到该主题。

https://aws.amazon.com/blogs/aws/queues-and-notifications-now-best-friends/

这两个队列都会收到消息,但您只能将其加载到SNS中一次-如果接下来第三个不相关的服务还需要处理“注册新”事件,您可以创建另一个队列并将其订阅到主题-它可以在不依赖于其他服务或不知道其他服务正在做什么的情况下运行-这就是目标。

 类似资料:
  • 问题内容: 我有一个JMS客户端,它正在生成消息并通过JMS队列发送到其唯一的使用者。 我想要的是不止一个消费者收到这些消息。我想到的第一件事是将队列转换为主题,以便现有用户和新用户都可以订阅并将相同的消息传递给他们。 显然,这将涉及在生产者和消费者方面修改当前的客户代码。 我还要查看其他选项,例如创建第二个队列,这样就不必修改现有的使用者。我相信这种方法有很多优点,例如(如果我错了,请纠正我)在

  • 由于消息需求的排序,我们有一个主题和一个分区。我们有两个消费者运行在不同的服务器上,具有相同的配置集,即groupId、consumerId和consumerGroup。即 1主题- 当我们部署消费者时,相同的代码会部署在两台服务器上。当消息到来时,我们会注意到两个消费者都在消费消息,而不是只有一个处理。让消费者在两台独立的服务器上运行的原因是,如果一台服务器崩溃,至少其他服务器可以继续处理消息。

  • 我有三根线。线程1(T1)是生成器,它生成数据。线程2和线程3(T2和T3)分别等待T1的数据在单独的循环中处理。我正在考虑在线程之间共享BlockingQueue,并通过调用“Take”让T2和T3等待。

  • 我用java编写我所有的微服务。我想在Amazon SQS中使用多个消费者,但每个消费者在负载均衡器后面的AWS上有多个实例。 我使用SNS作为输入流 我在SNS之后使用SQS标准队列。 我在stackoverflow上发现了同样的问题(使用多个消费者的Amazon SQS) 此示例为 https://aws.amazon.com/fr/blogs/aws/queues-and-notificat

  • 是否有一种方法以编程方式访问和打印使用者滞后偏移,或者说使用者读取的最后一条记录的偏移与某个生产者写入该使用者分区的最后一条记录的偏移之间的位置差。 要知道我的最终目标是将这个值发送到prometheus进行监视,我应该在上面添加哪些语句来得到滞后偏移值?

  • 我花了几个小时想弄清楚发生了什么,但没能找到解决办法。 这是我在一台机器上的设置: 1名zookeeper跑步 我正在使用kafka控制台生成器插入消息。如果我检查复制偏移量(