考虑一下这个简化的例子:在一个在线售票网站中,门票的价格会随着时间的变化而变化。
用户搜索门票。一旦他找到一张他想要的票,点击“购买”,然后发出报价。报价是持久化的,他们有自己的定位器,是通过电子邮件发送的。引文页打开,显示他将要支付的费用的细目,以及一个要支付的按钮。此时,票仍可供其他人使用。如果用户单击“立即付款”,将启动付款过程,并向其发出购买订单并提供详细信息。
支付购买订单时,报价状态必须设置为“接受”,并引用购买订单;票务状态设置为“售出”。
根据需求,这必须以原子的方式发生,这意味着在任何给定的时间内,有一个付费的定购单引用一个不被接受的报价,或者一个未售出的票是不可接受的。基本上,最终的一致性是不允许的。
有两个大的聚合体,Quote和PurchaseOrder。第一,管理故障计算,税收等.第二种管理报价、支付事件的支付细节等.我的问题是,现在看来,当最后一次付款时,我必须使用跨票证、报价和订购单的交易。
我怎样才能对“事务不应跨越聚合边界”规则进行建模?
发布于 2017-06-28 06:01:34
您需要一个流程管理器/saga,它可以完全满足您的需要,而不需要使用生成多个聚合的事务。
基本上,在付款开始之前,佐贺就会reserve票,付款成功后会是markTicketAsSold还是付款失败后的releaseTheReservation。
这个过程和reserved或sold票证不能再次成为reserved这一不变式将确保系统始终处于正确的状态。
根据需求,这必须以原子的方式发生,这意味着在任何给定的时间内,有一个付费的定购单引用一个不被接受的报价,或者一个未售出的票是不可接受的。基本上,最终的一致性是不允许的。
这似乎不是一个有效的不变式。不变的应该是“已售出的票不能再售出”。仔细定义业务不变量将有助于您设计聚合边界并正确地建模长期运行的流程。
https://softwareengineering.stackexchange.com/questions/351721
复制相似问题