假设我有一个银行应用程序(我不是在开发一个银行应用程序,但我相信它可以解决我在许多事件采购示例中使用的问题),它会生成以下消息:
1) Apply £110 withdrawal to account A
2) Apply £70 credit to account A
3) Apply £99 withdrawal to account A
4) Apply £42 withdrawal to account A
假设帐户A没有透支。现在说第三条消息因为该消息特有的错误而失败,例如序列化错误。在此方案中,消息3被添加到NServiceBus错误队列中。
我理解的方式是管理员使用像Service Pulse这样的工具来隔离处理错误队列。假设管理员需要两个小时来处理错误,并且在该时间内第四个交易完成。这是否意味着第四笔交易在第三笔交易之前处理并且账户可以进行透支?
我已经完成了NServiceBus的在线课程,我仍然不清楚这一点。我还在这里查看了类似的问题,例如:In CQRS how to work with NServiceBus to update Command and Query store
答案 0 :(得分:0)
这是一个很好的问题。作为这些事件来源的系统在余额方面具有权威性。银行业的核心'是一个更传统的分类帐,有两阶段提交(而且我见过的大多数都有一个夜间循环过程,决定你是否已经透支)。这个核心系统可以发布信息事务和其他可以转换为NServiceBus的东西。有了这个,您可以做各种有用的事情,如发送文本提醒,通知其他系统此活动,订阅欺诈预警系统,订阅奖励平台累积奖励积分等。
事件的顺序可能会因为你说的错误而失败。这是异步消息传递和存储转发的现实。每个接收系统都必须应对这一现实。您可以通过时间戳在目的地重新订购它们(如果有的话),但您无法确定在任何给定时间都拥有它们。
关于透支条件,考虑这一点的最佳方式是将其作为与权威核心分开的事件来源。它是唯一知道并且可以推动帐户透支的系统'一种事件本身可以触发通知,费用,给分公司经理一张纸条......