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.
如果我们要为这样的功能设计一个聚合(假设它是一个订阅),我们应该把与第三方的交互放在哪里API?
如果我们集成的第三方允许用户完全绕过我们的应用程序将自己从系统中删除怎么办?现在我们的聚合将不同步。
通常,聚合不是在系统级别而是在某些数据上强制执行一致性。这个概念是在 DDD blue book 中引入的,当时大多数解决方案都依赖于传统的大规模 SQL 数据库,它旨在将一致性的责任从存储层转移到业务逻辑中。这样做是因为这就是一致性:业务逻辑。如果您在销售某物时必须减少库存,这是一个一致性规则,并且应该与其他业务逻辑一起存在于应用程序代码中,而不是委托给存储过程。
考虑到这一点,您拥有的任何聚合都不会(实际上不能)强制与外部世界保持一致(这不是您拥有和内部持有的数据)。但是,您可以做的是引入两个(或一个组合的)流程管理器:
- 一个进程管理器将强制执行“当用户要求删除时,将其从外部系统中删除”的策略。这将观察内部请求,并在用户请求删除时调用第三方服务删除用户
- 一个流程管理器将执行“当用户从第三方服务中删除时,在我们的系统中也将其标记为已删除”的策略,这几乎可以实现策略所说的
您可能有也可能没有订阅聚合。决定这一点的是,您是否需要围绕您拥有和负责的数据强制实施某种一致性。
这个问题实际上是双重的,强调最重要的问题。
Aggregates define the consistency and transactional boundaries of a system.
假设您的公司通过应用程序提供某些服务,而您将通过与第三方的集成来添加新功能。第三方有自己的 API,当他们选择使用新功能时,您需要在他们的系统中创建用户。现在,您不是怪物,因此您允许用户关闭该功能(如果他们之前已经开始使用该功能)。这意味着您还必须能够删除第三方中的用户 API.
如果我们要为这样的功能设计一个聚合(假设它是一个订阅),我们应该把与第三方的交互放在哪里API?
如果我们集成的第三方允许用户完全绕过我们的应用程序将自己从系统中删除怎么办?现在我们的聚合将不同步。
通常,聚合不是在系统级别而是在某些数据上强制执行一致性。这个概念是在 DDD blue book 中引入的,当时大多数解决方案都依赖于传统的大规模 SQL 数据库,它旨在将一致性的责任从存储层转移到业务逻辑中。这样做是因为这就是一致性:业务逻辑。如果您在销售某物时必须减少库存,这是一个一致性规则,并且应该与其他业务逻辑一起存在于应用程序代码中,而不是委托给存储过程。
考虑到这一点,您拥有的任何聚合都不会(实际上不能)强制与外部世界保持一致(这不是您拥有和内部持有的数据)。但是,您可以做的是引入两个(或一个组合的)流程管理器:
- 一个进程管理器将强制执行“当用户要求删除时,将其从外部系统中删除”的策略。这将观察内部请求,并在用户请求删除时调用第三方服务删除用户
- 一个流程管理器将执行“当用户从第三方服务中删除时,在我们的系统中也将其标记为已删除”的策略,这几乎可以实现策略所说的
您可能有也可能没有订阅聚合。决定这一点的是,您是否需要围绕您拥有和负责的数据强制实施某种一致性。