具有许多小队列的 RabbitMQ 强制执行顺序执行(模式或反模式)?
RabbitMQ with many small queues to enforce sequential execution (pattern or anti-pattern)?
假设(但更简单)的场景:
- 我的系统里有很多订单。
- 我有影响这些订单的外部触发器(例如网络钩子)。它们可能并行发生,并由我的集群中的不同实例处理。
- 在单个订单的范围内,我想确保这些事件按顺序处理以避免竞争条件、版本冲突等。
- 不同订单的事件可以(并且应该)并行处理
我目前正在研究利用 RabbitMQ 进行类似设置的想法:
- 为每个订单使用一个队列(即时创建)
- 如果事件发生,将其放入该队列
这些队列将是短暂的,所以我最终不会有数百万个队列,但它无论如何都应该扩展(如果项目大幅增长,我们可以说降低一位数)。问题是就 RabbitMQ(或类似)系统而言,这是否是绝对反模式,或者是否有更好的解决方案来确保顺序执行。
谢谢!
在我看来,创建临时队列可能不是一个好主意,因为创建和删除队列会产生相当大的开销。重点应该放在消息消费上。我可以想到以下解决方案:
您可以通过构建发布策略来限制队列的数量,例如所有订单 ID 可被 2 整除的订单进入 queue-1,可被 3 整除的订单进入 queue-2 等等。这将为您提供并行吞吐量以及有限数量的队列,但是您必须处理一些额外的发布者逻辑
相同的逻辑可以通过使用单个发布-订阅样式队列转移到消费者端,然后消费者有责任过滤不需要的 orderIds
如果你乐于探索其他技术,你也可以看看 Kafka,在那里你可以使用 orderId 作为 partitionKey 并使用多个分区来获得并行吞吐量。
假设(但更简单)的场景:
- 我的系统里有很多订单。
- 我有影响这些订单的外部触发器(例如网络钩子)。它们可能并行发生,并由我的集群中的不同实例处理。
- 在单个订单的范围内,我想确保这些事件按顺序处理以避免竞争条件、版本冲突等。
- 不同订单的事件可以(并且应该)并行处理
我目前正在研究利用 RabbitMQ 进行类似设置的想法:
- 为每个订单使用一个队列(即时创建)
- 如果事件发生,将其放入该队列
这些队列将是短暂的,所以我最终不会有数百万个队列,但它无论如何都应该扩展(如果项目大幅增长,我们可以说降低一位数)。问题是就 RabbitMQ(或类似)系统而言,这是否是绝对反模式,或者是否有更好的解决方案来确保顺序执行。
谢谢!
在我看来,创建临时队列可能不是一个好主意,因为创建和删除队列会产生相当大的开销。重点应该放在消息消费上。我可以想到以下解决方案:
您可以通过构建发布策略来限制队列的数量,例如所有订单 ID 可被 2 整除的订单进入 queue-1,可被 3 整除的订单进入 queue-2 等等。这将为您提供并行吞吐量以及有限数量的队列,但是您必须处理一些额外的发布者逻辑
相同的逻辑可以通过使用单个发布-订阅样式队列转移到消费者端,然后消费者有责任过滤不需要的 orderIds
如果你乐于探索其他技术,你也可以看看 Kafka,在那里你可以使用 orderId 作为 partitionKey 并使用多个分区来获得并行吞吐量。