【发布时间】:2020-01-03 18:15:14
【问题描述】:
我有 2 个应用程序服务,它们与 2 个不同的聚合相关。
我有一些操作需要调用另一个服务来获取数据并运行一些操作。由于不同聚合的事务边界,我不想这样做。
除了服务之间的直接通信之外,还有什么解决方案?从技术上讲,它是一个整体的 Spring 应用程序。
【问题讨论】:
标签: java spring domain-driven-design aggregate
我有 2 个应用程序服务,它们与 2 个不同的聚合相关。
我有一些操作需要调用另一个服务来获取数据并运行一些操作。由于不同聚合的事务边界,我不想这样做。
除了服务之间的直接通信之外,还有什么解决方案?从技术上讲,它是一个整体的 Spring 应用程序。
【问题讨论】:
标签: java spring domain-driven-design aggregate
Domain Events 可能是您的答案。来自微软documentation
使用域事件显式实现域内更改的副作用。换句话说,使用 DDD 术语,使用领域事件来显式地实现跨多个聚合的副作用。或者,为了获得更好的可扩展性并减少对数据库锁的影响,请在同一域内的聚合之间使用最终一致性。
例如:考虑两个聚合 Customer 和 Order。当Customer 将商品添加到购物车时,您需要更新Order。
让我们假设Customer 域上的操作/方法的名称是AddItemToCart。操作完成后,您会从 Customer 聚合中引发类似 ItemAdded 的域事件。然后由域事件处理程序处理此事件。在EventHandler 中,您将执行更新Order 聚合的操作。
请注意,领域事件与集成事件不同。处理领域事件是应用程序关注的问题。领域事件可以在内存中和单个事务中实现。 另一方面,集成事件将提交的事务传播到外部应用程序或不同的微服务(如审计服务)。
【讨论】: