场景1
场景#2
场景#3
场景4(问题开始...)
场景#n [#4的许多变体] ...
因此,我无法确定清楚如何使用DDD中的状态改变状态的Web服务的标准。
理想情况下,我将在存储中进行更改,然后使用某种集成层来复制外部数据库或服务中的更改,例如使用事件。但是,大多数情况下,存在写后读一致性要求,如果您在操作返回后刷新,则会在屏幕上显示正确的数据(例如:来自同一笔付款的Web服务的付款收据)
另一个示例:屏幕允许保存有关书籍的数据,但是书籍规格保存在数据库中,描述(几种语言)保存在外部服务中。操作必须一致,如果用户单击“保存”并刷新,则屏幕需要全部显示,不能仅显示具有旧翻译的规范,或者根本不显示翻译,因为它们已被复制到另一个数据库。
哪个是确定的标准?
答案 0 :(得分:2)
答案是阅读Life Beyond Distributed Transactions。
简短的形式是,尝试可靠地协调不同位置的写入非常昂贵。在大多数情况下,最好在您的设计中承认您不能一次到处都是,并投资于处理该事实的后果。
答案 1 :(得分:1)
我一直适用的规则是Aggregate应该是纯净的,不依赖于进行IO调用的服务(即磁盘或网络)。每次在给定状态下执行命令时,它应该给出相同的结果。在方法调用中注入服务或将其作为参数传递会破坏此规则。抽象的想法是聚合永远不要基于它不拥有的数据做出决定。
但是,每个复杂系统都包含多个集合。它还包含对业务流程进行建模的Sagas /流程经理(从现在开始就是Saga)。设计完美的Saga的所有需求就是一个清晰的业务流程和幂等的端点。
Saga开始,然后通常通过订阅Domain事件来侦听域中的更改。它通过将命令发送到相应的端点来对它们做出反应。请注意,我使用术语“端点”来指代任何以幂等方式处理命令的接收器。纯聚合就是这样的端点。但是Saga端点也可以是外部系统,例如支付网关。这样的网关不应使用现有的PaymentID
(系统正在发送的不透明字段)来发起新的付款。
结论:据我了解,您所有的方案都可以实施为Sagas。