DDD - 与第三方系统集成时如何确保总体一致性?

问题描述

这个问题实际上有两个方面,强调最重要的问题。

聚合定义了系统的一致性和事务边界。

假设您的公司通过应用提供一些服务,并且您将通过与第三方的集成添加功能。第三方有自己的API,当他们选择使用新功能时,你需要在他们的系统中创建用户。现在,您不是怪物,因此您允许用户在之前开始使用该功能的情况下关闭功能。这意味着您还必须能够在第三方 API 中删除用户

  • 如果我们要为这样的功能设计一个聚合(假设它是一个订阅),我们应该把与第三方 API 的交互放在哪里?

  • 如果我们集成的第三方允许用户完全绕过我们的应用程序将自己从他们的系统中移除会怎样?现在我们的聚合将不同步。

解决方法

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

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

  • 一个流程管理器,它会强制执行“当用户要求删除时,将其从外部系统中删除”的策略。这将观察内部请求并在用户请求删除时调用 3rd 方服务以删除用户
  • 一个流程管理器将强制执行“当用户从第三方服务中删除时,也将其在我们的系统中标记为已删除”的政策,这与政策所说的差不多

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