如何使用分散/聚集模式实现传奇在MassTransit 3.0中

吉米·博加德(Jimmy Boagard) 在这里描述了一个麦当劳快餐连锁店(McDonalds fast food chain), 在这里将其与分散收集模式相比较

从上面的文章中偷取的工作stream图像: 在这里输入图像说明

初步实施思路:

对于所有食品站将获得的所有types的食品事件具有共同的接口,然后每个食品站将能够消费/创build其相应的项目并发布通用事件。 例如:炸薯条和汉堡包关于炸薯条的命令,炸薯条消费命令宣布事件正在监听的ItemDoneEvent。

最初的担忧:

由于佐贺不关心完成的食物types,所有的食物都完成了这似乎是一个好的解决scheme。 然而, 阅读了关于共享队列的警告之后 ,我们注意到, 使用MassTransit 3.0消除了Consumer.Conditional过滤。这种方法似乎认为框架会说“Bad Things(TM)将会发生”。 但是我不确定你还会怎么做,只要在厨房里为每个食物创build一个消息请求和响应,并将事件关联起来。 例如:FriesOrdered,BurgerOrdered FriesCooked,BurgerCooked。 如果你必须为厨房里的每一件物品做这件事,这将是非常乏味的。

考虑到上述问题 – 这种types的工作stream程的好例子是什么样的?

将事件踢回事件的问题是它会在共享资源(即传奇状态)上产生争用。

吉姆有另一篇文章,是在你引用的那篇文章之后,概述了问题和解决scheme。 当然,他具体谈的是NServiceBus,但问题和概念是一样的。

https://lostechies.com/jimmybogard/2014/02/27/reducing-nservicebus-saga-load/

创build一个外部存储。 为每个工作项目logging一个logging。 让每个工作者自己完成工作,而这个事件通过延迟信息有效地进行轮询,看是否所有的工作都完成了。

那么你仍然在做分散收集,但是“聚合器”已经被进程pipe理器模式所取代,以减less争用。