在DDD中,我了解事件可以在他们彼此沟通时将有界上下文解耦。假设原子事务在分离的有界上下文A和B上包含两个数据库操作。当A上的操作完成时,它发送并由B处理的事件完成第二个操作。但是,如果B上的操作失败,A上的操作如何回滚?
例如,我目前正在使用域驱动设计设计系统。它包含成员资格和库存有界上下文。为了解耦上下文,我使用事件:当支付订单时,库存上下文将减少已售产品的数量,并发送Product_Sold事件。然后,会员资格上下文处理该事件,然后根据销售产品的价格减去用户的余额。
但是,如果用户余额更新因数据库故障而失败,则Inventory上下文如何知道它以便它可以回滚先前减少的产品数量?
答案 0 :(得分:2)
这实际上是一种称为Saga的模式。
答案 1 :(得分:0)
当您使用事件在上下文之间进行通信时,只需发布Product_NotSold并在收到此事件时回滚事务。
但是,你不能提供原子'以这种方式交易。这是一个漫长的过程(a.k.a. saga)。如果您真的想要原子性,则需要使用两阶段提交和放弃事件。