DDD /事件来源,是从另一个微服务获取数据吗?

时间:2019-10-06 20:26:37

标签: domain-driven-design microservices cqrs event-sourcing

我想知道您能否提供帮助。我正在编写一个订单系统,目前已经实现了一个订单微服务,该服务负责下订单。我正在将DDD与事件源和CQRS结合使用。

订单服务本身接受产生事件的命令,实际的订单服务会侦听自己的事件以创建读取模型(此处的想法是使用CQRS,因此用于写入的命令和用于读取的查询)

实施上述操作后,我遇到了一个问题,可能只是我没有完全理解正确的方法。

订单实际上具有从属关系,这意味着订单需要一个客户和一个或多个产品。因此,我将为客户和产品提供2种其他微服务。

为简单起见,我想专注于客户(尽管我在产品上存在完全相同的问题,但我的想法是,如果我解决客户问题,那么另一个也会自动解决)。

所以回到眼前的问题。要创建订单需要客户(和产品)的订单,我目前在客户端上有customerId,因此,向订单服务发送命令时,我可以传递customerId。

我想在订单中保存客户的姓名和地址。如何从订单服务中的客户服务获取客户编号的名称和地址?

我想总结一下,当一项服务中的数据需要另一项服务中的数据时,我该如何获取这些数据。

订购服务会创建一个事件来接收客户记录的情况吗?这将在系统中引入很多复杂性(更多事件)

微服务没有耦合,因此订购服务不能仅仅调用客户的读取模型。

有人能帮助我吗?

3 个答案:

答案 0 :(得分:1)

如果您使用的是DDD,请首先阅读有关边界上下文的信息。忘记微服务,它们只是实现策略。

现在回到您的问题。从客户集合(在您的情况下为客户微服务)发布以下事件:CustomerRegisteredCustomerInfoUpdatedCustomerAccountRemovedCustomerAddressChanged等。然后订阅您的订购服务(同样在案例应用程序中)订单微服务内部的服务)来侦听上述所有事件。好吧,不是全部,只是需要什么订单。

Bounded Context 现在,您可能有一个问题,如果我的大多数或某些客户不下订单怎么办?我的订单服务将充满不必要的数据。这是个好方法吗?

好吧,答案可能会有所不同。我想说,从性能角度来看,硬盘中的空间比内存便宜,或者数据库查询比网络调用更快。如果您的数据库主机(或服务器)受到限制,那么您不应该使用微服务。此外,我会使用这些未使用的客户数据(例如,列出所有从未订购过任何产品的客户,我将向他们发送一些报价以发展我的业务。开玩笑。不要为微服务中未使用的数据感到困扰。

答案 1 :(得分:0)

我的建议是在前端收集所需的数据并将其传递。您要对订单进行非规范化的相关客户详细信息将是一个价值对象。与订单行相关的产品数据(例如ID,说明)也是如此。

让系统交互以检索数据并非不可能,但这确实将它们耦合在较低的层次上。

答案 2 :(得分:0)

  

当一项服务中的数据需要另一项服务中的数据时,我如何获取这些数据?

您将其复制。

因此,在设计中的某处需要一条消息,用于将数据从其实际位置传送到需要的地方。

这可能意味着订单服务正在订阅由客户服务发布的事件,并存储其所需信息的副本。或者可能是订单服务查询某些可以直接访问客户服务存储的数据的API。

查询所需的其他数据可以是同步的或异步的-也许可以将工作推迟到拥有所需的所有数据为止。

另一种可能性是您重新设计系统,以使所需的业务能力与数据保持一致,或者移动能力,或者移动数据。为什么订购需要客户数据?客服可以代替工作吗?应该订购数据吗?

在跨多个服务分发工作的决策中固有一定的复杂性。分配系统的决定涉及权衡各种权衡。