CQRS+DDD+事件溯源中的跨聚合通信

29

在基于DDD原则和事件溯源的环境中,如何使分离的聚合根(AR)相互通信?

例如,我有一个名为Facility的聚合根(AR),它具有负责创建Booking AR的工厂方法。 BookingPerson AR和Facility AR的时间敏感组合。 一个Person只能被预订到一个Facility

在DDD中,我将在Person中保留对Booking的引用,在Facility中保留对Person的引用。但是,在生成用于事件溯源的事件时,我认为尝试处理后端的事件反序列化会变得很困难。因此,我已经开始仅持有基于值对象的唯一标识符的引用。然而,这带来了一个新问题,当一个AR上的方法需要调用另一个AR上的方法时,如何处理该情况?从领域AR击中事件源存储库?

在这种情况下的一般用例是什么?我是否在错误的方向上思考了?

2个回答

48

聚合根边界定义了一致性边界。 在聚合内部,一致性是得到保证的。 在聚合外部...就不是这样了。 因此,您不应该有跨越多个聚合并需要保持一致性的操作。 如果您需要跨越两个聚合的事务,则应重新审查聚合边界。

对于在聚合外发生的事件,您应该有一个事件处理程序来发送命令给其他聚合。 如果聚合之间的行动逻辑更加复杂,可以定义一个流程,即状态机,来监听事件并向聚合发送命令。 流程可以用于定义长时间运行的事务(使用补偿而非回滚),或者根据系统中大规模发生的情况(甚至在有界上下文之间)做出业务决策。


2
好的回答 - 如果你想深入了解这个话题,你可能会发现这篇文章很有帮助:事件溯源系统中的聚合间通信 - Codescribler

4
使用事件溯源和CQRS时,最优雅(至少在我看来)的AR间通信方式是消息传递。你可以查看Ncqrs项目(如果你是.NET开发者,这将更容易),特别是'Messaging'分支。其思想是,AR为其处理的每种消息类型实现IMessageHandler接口,而AR基类公开了发送消息的Send方法。通过这个API,客户端可以调用模型行为,模型本身也可以在AR之间进行通信。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接