与NServicebus和服务实现的竞争条件

时间:2012-09-17 07:28:16

标签: service nservicebus race-condition saga

我有一个对产品负责的传奇服务ProcessCatalog 目录发布过程。

客户端应用程序向其发送PublishCatalog消息;每条消息都包含 catalogid和项目列表。

我选择了catalogid作为SagaId。

ProcessCatalog服务是一个长期运行的业务流程,安排得当 订购其他商业服务。

我需要ProcessCatalog记住目前的目录项组成 推动出版过程。

无论同一用户是否第一次在UI按钮上发送,都会发生什么 PublishCatalog(catalogId = 1,Itemlist = {A,B,C})然后更改目录 组合(itemList = {A,D,E}),然后点击UI按钮上的另一个时间发送 另一个PublishCatalog用于相同的CatalogId?

如果我的ProcessCatalog端点配置了一个workerthread,则一切正常 很好(我想)。但是如果workthread大于1和2会发生什么 消息是以并发方式处理的?如果第二个线程完成会发生什么 在第一个线程之前执行?

我问我这是商业设计错误还是正常的技术问题。

1 个答案:

答案 0 :(得分:0)

由于Saga是管理状态,这两条消息应该与相同的Saga相关联。在你的传奇中,你将不得不处理每条消息并解决任何冲突。业务规则必须定义在目录发布过程中更改目录时会发生什么。

可能是Saga被允许完成,然后是另一个Saga来修改目录。通常,对于产品目录,消费者只关心当前的内容,并且能够在初始发布后吸收更改。如果有大量工作要发布,那么你可能想要取消Saga并重新启动它。如果是这种情况,那么UI可能需要更多地转变为建模工具,用户可以在其中使用目录,然后在完全满意时提交。