use*_*763 26 event-based-programming amazon-sqs amazon-web-services microservices
我有一个基于服务的应用程序,它使用具有多个队列和多个消费者的Amazon 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'事件,您还可以创建另一个队列并订阅该主题 - 它可以运行时没有依赖关系或知道其他服务正在做什么 - 这就是目标.
队列的多个消费者的主要用例是横向扩展。
允许多个消费者的机制是Visibility Timeout,它使消费者有时间处理和删除消息,而不会被另一个消费者同时消费。
为了解决标准队列的“至少一次交付”属性,消费服务应该是幂等的。如果这不可能,一种可能的解决方案是使用FIFO 队列,但这种模式的消息传递率有限,并且与 SNS 订阅不兼容。
| 归档时间: |
|
| 查看次数: |
16835 次 |
| 最近记录: |