感谢banq详细的回答哈。
actor模型确实比较好。但是我之前的问题是:如果transfer,accountA,accountB分别在自己的聚合边界内。而且transfer聚合根内部就算同时产生了CreditPreparationConfirmed,DebitPreparationConfirmed这两个事件,那按照你的意思,应该就是业务上做到了“强一致性的事务”这点我仍同;但是这两个事件会分别被AccountA,AccountB处理,这两个账号接收到command命令后做第二阶段的真正的扣款或加款。
由于AccountA,AccountB是不同的聚合根,我们衡量最后转账是否有么有成功也是去看AccountA,AccountB的余额是否正确变化了为准。按照聚合根之间“使用最终一致性”的理念,那就是实际上我们并不是去保证AccountA,AccountB的强一致性(物理上的事务一致性),是吗?
我觉得,Transfer聚合根内部同时产生的CreditPreparationConfirmed,DebitPreparationConfirmed这两个事件,只是表示Transfer确认了转入和转出这两个动作可以执行了,然后外界的两个账号聚合根响应该事件,做各自的加钱和扣钱操作;但谁也无法保证AccountA,AccountB这两个聚合根实际在做自己的加钱或扣钱动作时不会失败;因为我们在技术上是使用了通过消息队列的方式来实现异步消息通信,所以不可能保证这两个动作在一个技术上强一致性的事务内。是吗?
也就是结论是,转账这个场景,从数据上看,没有实现强一致性,而是最终一致性;而业务上,如果以Transfer聚合根同时产生了CreditPreparationConfirmed,DebitPreparationConfirmed这两个事件的角度去来判断是否是业务上的强一致性的话,那确实是做到了业务上的强一致性,因为CreditPreparationConfirmed,DebitPreparationConfirmed这两个事件对外界来说确实是一起产生的,且一定是以事务的方式被持久化的。
但问题是,我们最后难道不是以数据的变化是否为强一致性来判断整个转账场景是否是强一致性的吗?
[该贴被tangxuehua于2013-09-18 12:48修改过]