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

use*_*763 26 event-based-programming amazon-sqs amazon-web-services microservices

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

  • 注册服务:
    • 当新用户注册时,发出事件'registration-new'.
  • 用户服务:
    • 在用户更新时发出事件'用户更新'.
  • 搜索服务:
    • 从队列'registration-new'读取并在搜索中索引用户.
    • 从队列"用户更新"中读取并在搜索中更新用户.
  • 指标服务:
    • 从"registration-new"队列中读取并发送到Mixpanel.
    • 从队列'用户更新'中读取并发送到Mixpanel.

我有很多问题:

  • 进行轮询时,可以多次接收消息.我可以设计很多系统是幂等的,但是对于某些服务(例如度量服务)来说要困难得多.
  • 需要在SQS中从队列中手动删除消息.我曾想过实现一个"消息处理服务",它在所有服务都收到消息时处理消息的删除(每个服务在处理消息后都会发出'消息确认'事件).

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

E.J*_*nan 44

我觉得你做错了.

在我看来,你使用相同的队列来做多个不同的事情.您最好将单个队列用于单一目的.

而不是将一个事件放入'registration-new'队列,然后让两个不同的服务轮询该队列,并且BOTH需要读取该消息并且两者都做了不同的事情(然后需要一个应该删除的第三个进程)其他2个处理后的消息).

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

  • 创建"index-user-search"队列和"send to mixpanels"队列,以便搜索服务从搜索队列中读取,为用户编制索引并立即删除该消息.

  • mixpanel-service从mix-panels队列中读取,处理
    消息并删除消息.

注册服务现在将其发送到两个队列,而不是向单个队列发出"registration-new".

为了更好地做到这一点,在这里将SNS添加到混合中并让注册服务向'registration-new'主题(不是队列)发出SNS消息,然后在上面提到的两个队列中订阅该主题.一个'扇出'的模式.

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

两个队列都将收到消息,但您只需将其加载到SNS中一次 - 如果在路上第三个不相关的服务还需要处理'registration-new'事件,您还可以创建另一个队列并订阅该主题 - 它可以运行时没有依赖关系或知道其他服务正在做什么 - 这就是目标.

  • FIFO qeue怎么样?您可以使用SNS实施严格的订购吗? (2认同)

nob*_*bar 5

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

允许多个消费者的机制是Visibility Timeout,它使消费者有时间处理和删除消息,而不会被另一个消费者同时消费。

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

  • * FIFO 队列现在与 SNS 兼容 (2认同)