【问题标题】:Using Amazon SQS with multiple consumers将 Amazon SQS 与多个使用者一起使用
【发布时间】:2015-07-29 13:36:42
【问题描述】:

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

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

我遇到了很多问题:

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

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

【问题讨论】:

    标签: amazon-web-services amazon-sqs microservices event-based-programming


    【解决方案1】:

    队列的多个消费者的主要用例是scaling-out

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

    要解决标准队列的"At-Least-Once Delivery" 属性, 消费服务应该是idemptotent。 如果这不可行,一种可能的解决方案是使用FIFO queues,但此模式的消息传递率有限,为not compatible with SNS subscription

    【讨论】:

    【解决方案2】:

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

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

    可惜它不支持 FIFO 队列,所以你必须小心处理乱序消息。

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

    【讨论】:

      【解决方案3】:

      我认为你做错了。

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

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

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

      • 创建一个“索引用户搜索”队列和一个“发送到混合面板”队列, 所以搜索服务从搜索队列中读取,索引用户 并立即删除该消息。

      • 混合面板服务从混合面板队列中读取,处理
        消息并删除消息。

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

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

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

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

      【讨论】:

      • 这是完美的。我不知道你可以用 SNS 做到这一点!谢谢!
      • FIFO队列呢?可以用 SNS 实现严格排序吗?
      • @ÖzerS。目前,上述使用 SNS 和 SQS 的扇出模式仅支持 SQS 标准队列。截至今天,不支持 SQS FIFO 队列。我还没有发现 AWS 是否打算在未来支持这一点。
      猜你喜欢
      • 2019-12-02
      • 2011-04-25
      • 2013-02-28
      • 2019-05-01
      • 2012-02-03
      • 2016-05-03
      • 2012-03-12
      • 2016-08-01
      • 1970-01-01
      相关资源
      最近更新 更多