DDD - 如何在与第三方系统集成时确保聚合一致性?

DDD - How to ensure aggregate consistency when integrating with third party systems?

这个问题实际上是双重的,强调最重要的问题。

Aggregates define the consistency and transactional boundaries of a system.

假设您的公司通过应用程序提供某些服务,而您将通过与第三方的集成来添加新功能。第三方有自己的 API,当他们选择使用新功能时,您需要在他们的系统中创建用户。现在,您不是怪物,因此您允许用户关闭该功能(如果他们之前已经开始使用该功能)。这意味着您还必须能够删除第三方中的用户 API.

通常,聚合不是在系统级别而是在某些数据上强制执行一致性。这个概念是在 DDD blue book 中引入的,当时大多数解决方案都依赖于传统的大规模 SQL 数据库,它旨在将一致性的责任从存储层转移到业务逻辑中。这样做是因为这就是一致性:业务逻辑。如果您在销售某物时必须减少库存,这是一个一致性规则,并且应该与其他业务逻辑一起存在于应用程序代码中,而不是委托给存储过程。

考虑到这一点,您拥有的任何聚合都不会(实际上不能)强制与外部世界保持一致(这不是您拥有和内部持有的数据)。但是,您可以做的是引入两个(或一个组合的)流程管理器:

  • 一个进程管理器将强制执行“当用户要求删除时,将其从外部系统中删除”的策略。这将观察内部请求,并在用户请求删除时调用第三方服务删除用户
  • 一个流程管理器将执行“当用户从第三方服务中删除时,在我们的系统中也将其标记为已删除”的策略,这几乎可以实现策略所说的

您可能有也可能没有订阅聚合。决定这一点的是,您是否需要围绕您拥有和负责的数据强制实施某种一致性。