Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns RabbitMQ-具有严格排序保证的并行处理_Design Patterns_Rabbitmq_Amqp_Paxos_Raft - Fatal编程技术网

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

Design patterns RabbitMQ-具有严格排序保证的并行处理,design-patterns,rabbitmq,amqp,paxos,raft,Design Patterns,Rabbitmq,Amqp,Paxos,Raft,在HappyFunPizzaCorp,我们有一个POS系统,它生成两个事件:新订单事件和付款事件。这两个事件都包含用于交叉引用的pizzaorder\u id键 这两个事件都被发送到一个exchangeTheExchange新订单事件总是在付款事件之前发出 我们是一个非常繁忙的地方,比如说,每秒销售100000个比萨饼,所以不能连续处理所有记录 因此,问题是我们如何并行处理我们的工作负载,同时仍然保证新订单事件在同一批比萨饼的付款事件之前得到处理 具有多个使用者的简单队列不行。我们得到消费者之间

在HappyFunPizzaCorp,我们有一个POS系统,它生成两个事件:
新订单
事件和
付款
事件。这两个事件都包含用于交叉引用的pizza
order\u id

这两个事件都被发送到一个exchange
TheExchange
<代码>新订单事件总是在
付款
事件之前发出

我们是一个非常繁忙的地方,比如说,每秒销售100000个比萨饼,所以不能连续处理所有记录

因此,问题是我们如何并行处理我们的工作负载,同时仍然保证
新订单
事件在同一批比萨饼的
付款
事件之前得到处理

具有多个使用者的简单队列不行。我们得到消费者之间的循环行为,因此有可能对同一批比萨饼的
付款
事件与
新订单
事件同时处理

另一种解决方案是使用分片交换,并使用
order\u id
作为分片键。虽然这听起来不错,但我们现在在队列之间有了一些固有的并行性,我们的消费者如何连接?我们可以有一组预定义的队列,以防止由于重新分片而导致消息之间的重新分片和并行。但是,如果我们有多个使用者实例,它们如何决定使用哪些队列数据呢。最重要的是,我们想自动扩大我们的消费者规模

我们当前的解决方案是使用一致协议(通过zookeeper的raft/paxos)来确定每个使用者进程应该服务多少队列以及哪些队列。我们在系统中预先设置了(大量)分片队列,这些队列不应该改变。队列的消费者是排他性的(最多提供一次交付保证),他们通过协商一致协议协调哪些队列应由谁提供服务


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

这是家庭作业吗?如果没有,你想解决的实际问题是什么?为什么在新订单完成之前,
payment
事件被添加到任何队列中?如果将
付款
事件添加为
新订单
的最后一步,问题就解决了。这不是家庭作业。这是工作中的一个问题,我想收集一些关于方法的意见。对于相同的顺序,事件的顺序是:
new\u order
,然后是
payment
。然而,事件的处理可能需要时间,因此支付事件的处理可能与新订单事件的处理重叠。仍然没有遵循-付款是否对应于“将我的钱用于订单id X”,而新订单的意思是“请执行订单X”,你想在X完成后再拿钱吗?如果是这样的话,
payment
事件应该只在某个地方记录付款信息,就这样。然后,
新订单
可以启动第三个任务,例如,
在完成后处理付款
。最后一个任务将查找付款信息并执行其操作。在这个世界上,你可能真的想让
付款
成为开始
新订单
的先决条件,或者之后你可能会缺钱。