gpt4 book ai didi

amazon-web-services - 将 Amazon SQS 与多个消费者一起使用

转载 作者:行者123 更新时间:2023-12-01 19:54:52 27 4
gpt4 key购买 nike

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

  • 注册服务:
    • 当新用户注册时发出事件“registration-new”。
  • 用户服务:
    • 当用户更新时发出事件“user-updated”。
  • 搜索服务:
    • 从队列“registration-new”中读取数据并在搜索中为用户编制索引。
    • 从队列“user-updated”读取并更新搜索中的用户。
  • 指标服务:
    • 从“registration-new”队列读取并发送到 Mixpanel。
    • 从队列“用户更新”中读取数据并将其发送到 Mixpanel。

我遇到了一些问题:

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

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

最佳答案

我认为你做错了。

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

不要将事件放入“注册新”队列,然后让两个不同的服务轮询该队列,并且都需要读取该消息并对其执行不同的操作(然后需要第三个进程,即假定的进程)在其他 2 条消息处理完后删除该消息)。

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

  • 创建一个“index-user-search”队列和一个“send to mixpanels”队列,因此搜索服务从搜索队列中读取数据,为用户建立索引并立即删除该消息。

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

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

为了更好地实现这一点,请在此处将 SNS 添加到混合中,并让注册服务向“注册新”主题(而不是队列)发送一条 SNS 消息,然后订阅我上面提到的两个队列,以该主题以“扇出”模式。

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

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

关于amazon-web-services - 将 Amazon SQS 与多个消费者一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30296587/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com