领域驱动设计 - 跨多个有界上下文的原子事务

Domain Driven Design - Atomic transaction across multiple bounded context

在 DDD 中,我了解到事件在相互通信时可以解耦限界上下文。假设一个原子事务包含对分离的有界上下文 A 和 B 的两个数据库操作。当对 A 的操作完成时,它发送事件,该事件由 B 处理,完成第二个操作。但是,如果对 B 的操作失败,对 A 的操作如何回滚?

比如,我目前正在设计一个使用领域驱动设计的系统。它包含一个 Membership 和一个 Inventory 有界上下文。为了解耦上下文,我使用事件:当订单正在支付时,库存上下文将减少已售产品的数量,并发送一个 Product_Sold 事件。然后该事件由会员上下文处理,然后根据所售产品的价格减去用户的余额。

但是,如果由于数据库故障导致用户余额更新失败,Inventory context 如何知道它以便回滚之前减少的产品数量?

实际上有一个名为 Saga 的模式。

http://vasters.com/clemensv/2012/09/01/Sagas.aspx

http://nservicebus.com/Sagas.aspx

当您使用事件在上下文之间进行通信时,只需发布​​ Product_NotSold 并在收到此事件时回滚事务。

但是,您不能以这种方式提供'atomic'交易。它更像是一个漫长的 运行 过程(a.k.a.saga)。如果你真的想要原子性,你需要使用两阶段提交和放弃事件。