【问题标题】:Integration between various Domain Driven Design systems各种领域驱动设计系统之间的集成
【发布时间】:2011-09-25 06:45:46
【问题描述】:

我最近一直在采用领域驱动设计原则,但在实现有界上下文以及上下文和/或其他系统之间的集成时遇到了一些麻烦。

以以下系统为例:

仓库/库存系统 实体将包括具有诸如“数量”、“位置”等属性的“产品”

在线订购系统 实体将包括“Order”、“OrderLine”和“Basket”。它是否也有自己的 Product 实体,该实体具有诸如“价格”之类的属性?

订购系统的一个明确业务规则是不能为缺货的产品下订单,但此信息在库存管理系统中。据我了解,以下是一些可能的实现方式:

  1. 验证订单后,Order 对象会调用库存系统中的服务来检查每个所需产品是否有足够的库存。但是,域调用另一个系统的应用程序服务感觉有些不对劲,而且如果所有系统都这样做,这将导致一切都紧密耦合在一起。

  2. Ordering System 从 Stock Keeping System 的数据库中读取:Ordering System 中的 Product 实体映射到 Ordering System 中 Product 表和 Stock Keeping 系统中 Product 表的连接,或者Ordering System Product 实体包含另一个名为 StockKeepingProduct 的实体,该实体具有来自 Stock Keeping System 的值。这很容易执行验证,但必须确保订购系统永远不会写入库存系统的数据库。

  3. 库存数量被非规范化到订购系统的数据库中,每当库存管理系统的库存发生变化时,它都会向订购系统发送一条消息以更新其库存。

可能在内心深处我知道我应该做 3,但我不确定我们是否已经准备好处理如此多的冗余数据和可能的不一致。你对1和2有什么看法?或者您有什么其他建议?

【问题讨论】:

  • 事实上,是否应该有一个协调进程使用库存系统上的服务,如果商品有库存,则使用订购系统上的服务下订单?

标签: domain-driven-design soa distributed bounded-contexts


【解决方案1】:

这也完全取决于基础设施。如果您有 2 个系统在一个网络中运行,因此通信中断的可能性很小,我认为解决方案 1 没有问题。您可以将对 Stock Keeping System 的调用封装到适配器中,以便将来在您决定更改时轻松交换库存管理系统的API或系统完全如此。 In 还避免将其详细信息泄漏到订购系统中。

解决方案 3 更先进,需要更多资源来实施和维护,但允许这两个系统完全分离。更好地处理网络中断或性能瓶颈,例如订购系统需要处理比库存系统处理更多的请求。

但同样可以以与 1) 相同的方式实现 - 使用适配器分隔。恕我直言,从 DDD 的角度来看没有区别。

【讨论】:

  • 感谢您的意见。一般来说,我认为我正在接近 3,但这需要在我的工作场所进行一些文化改变。
  • 你们不认为解决方案 1 可能真的很危险和/或昂贵吗?如果我正在处理一个实体的实例(在这种情况下为 Order),并且我正在调用一个方法,那么从消费者的角度来看,对另一个服务甚至数据库的调用将是完全出乎意料的。跨度>
猜你喜欢
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 2017-06-06
  • 2012-11-28
相关资源
最近更新 更多