【问题标题】:RabbitMQ with many small queues to enforce sequential execution (pattern or anti-pattern)?RabbitMQ 有许多小队列来强制执行顺序执行(模式或反模式)?
【发布时间】:2021-12-14 12:22:06
【问题描述】:

假设(但更简单)的场景:

  • 我的系统中有很多订单。
  • 我有影响这些订单的外部触发器(例如 webhook)。它们可能并行发生,并由集群中的不同实例处理。
  • 单个顺序的范围内,我想确保按顺序处理这些事件以避免竞争条件、版本冲突等。
  • 可以(并且应该)并行处理不同订单的事件

我目前正在考虑利用 RabbitMQ 的类似设置:

  • 为每个订单使用一个队列(动态创建)
  • 如果发生事件,将其放入该队列中

这些队列将是短暂的,因此我不会最终获得数百万个队列,但无论如何它应该可以扩展(如果项目大幅增长,我们可以说更低的一位数)。问题是,就 RabbitMQ(或类似)系统而言,这是否是绝对的反模式,或者是否有更好的解决方案来确保顺序执行。

谢谢!

【问题讨论】:

    标签: rabbitmq fifo sequential-workflow


    【解决方案1】:

    在我看来,创建临时队列可能不是一个好主意,因为创建和删除队列会有相当大的开销。重点应该放在消息消费上。我可以想到以下解决方案:

    • 您可以通过构建发布策略来限制队列数量,例如所有 orderId 可被 2 整除的订单进入队列 1,可被 3 整除的订单进入队列 2,依此类推。这将为您提供并行吞吐量以及有限数量的队列,但您必须处理一些额外的发布者逻辑

    • 同样的逻辑可以通过单一的pub-sub风格的队列转移到消费者端,然后消费者有责任过滤不需要的orderIds

    • 如果您乐于探索其他技术,您也可以研究一下 Kafka,您可以在其中使用 orderId 作为 partitionKey,并使用多个分区来获得并行吞吐量。

    【讨论】:

    • 这是很好的输入,谢谢!固定的队列数是我考虑的一个选项,因为它仍然可以通过配置进行扩展,但我仍然会受到惩罚。不过,我也许可以通过消费者端的调度程序进一步减少这种情况(如果前一条消息不是针对相同的订单,则触发下一条消息的并行处理,否则请等待)。我目前对 Kafka 了解不多,但我会继续阅读。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2011-10-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    相关资源
    最近更新 更多