2012-08-29 27 views
1

对不起,我会尽力向你展示一个用例(这不是我真实世界的情况,所以请不要注意事件/服务名称或责任)来精心设计:nservicebus:确保所有事件得到处理的标准方法是什么?

考虑一个系统的服务(其中包括):“商店”和“经济”。商店服务处理项目购买并发布三个事件:“CustomerBoughtItem”,“CustomerReturnedItem”和“StoreIsClosed”。现在,经济服务部门会提取这些事件并每天创建一份财务报告。报告应该在店铺关闭后立即建立。所有来自店铺服务的事件都包含在日常报告中,这意味着经济服务无法在处理来自店铺的所有事件之前创建其财务报告,这一点至关重要。我如何确定性地确保在开始处理“StoreIsClosed”事件之前已在终点处理了所有“CustomerBoughtItem”和“CustomerReturnedItem”事件?

回答

1

您可以使用以下模式:

打开saga并接收这三个消息。每个消息都有一个顺序标识(例如int)。 保存所有顺序ID,并确定在每一个这些消息的接收的:

  • StoreIsClosed消息是在某个时间点
  • 所有ID(从0或1到StoreIsClosed-SequentialId的id)是接收到的顺序和没有ID缺失

如果这两个条件都满足发送最后一条消息通过.SendLocal(CreateDailyReportMessage)你的传奇。

更好的格式编辑,并回答了评论:

我想通过你的意思是另一种服务发布“StoreIsClosed”事件: ,其他服务没有现在,什么最后SequentialId是以上一般来说负责该事件的服务,即StoreIsClosed不知道有关客户交易的任何信息。

所以存储服务必须隐含或明确地为您提供更多的上下文信息,以使经济服务

例子:

  • (隐含的)订阅您storeservice的StoreIsClosed事件并发布CustomersHaveBoughtOrReturnedToday消息订阅你的传奇。在这里您可以包含交易ID列表,您可以交叉检查您的传奇或其他类型的校验和,如总交易次数或第一个顺序ID以及该商店的最后顺序ID。
  • (显式)在您的圣人已准备好完成之前明确地询问您的商店服务是否处理了所有交易。 (发送/回复你的传奇)
+0

这是一个有趣的方法,但你将如何去它我从另一个服务发布“StoreIsClosed”事件比商店服务? – Marius

+0

编辑答案回复你的问题。 –

相关问题