RabbitMQ - 具有严格排序保证的并行处理

时间:2017-11-02 19:26:13

标签: design-patterns rabbitmq amqp paxos raft

在HappyFunPizzaCorp,我们有一个POS系统,可以生成两个事件:new_order事件和payment事件。这两个事件都包含一个用于交叉引用的披萨order_id键。

这两个事件都会发送到交换TheExchangenew_order事件之前始终会发出payment个事件。

我们是一个非常繁忙的地方,比如每秒卖出100000个比萨饼,因此不能选择连续处理所有记录。

所以问题是我们如何并行处理我们的工作负载,同时仍然保证在同一披萨的new_order事件之前处理payment个事件?

一个有多个消费者的简单队列不会做。我们在消费者之间获得循环行为,因此payment事件可能与同一披萨的new_order事件同时处理。

另一种解决方案是使用分片交换并使用order_id作为分片键。虽然这听起来不错,但我们现在在队列之间有一些固有的并行性,我们的消费者如何联系?我们可以有一组预定义的队列,以防止因重新分片而在消息之间重新分片和并行。但是如果我们有多个消费者实例,他们如何决定使用哪些队列数据。最重要的是,我们希望自动扩展我们的消费者。

我们目前的解决方案是使用共识协议(通过zookeeper的raft / paxos)来确定每个消费者进程应该服务的队列和队列。我们在系统中有一个预先设置(大量)的分片队列,不应该改变。队列的消费者是独家的(最多只提供一次交付保证),他们通过共识协议进行协调,哪些队列应由谁服务。

虽然这个设置似乎会起作用,但它看起来过于复杂,我想知道是否有一个我们缺少的参考解决方案。

0 个答案:

没有答案