DDD / Event source,是否从另一个微服务获取数据?

问题描述 投票:0回答:3

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

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

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

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

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

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

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

我想总结一下,当一项服务中的数据需要另一项服务中的数据时,我如何获得此数据。

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

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

有人能帮助我吗?

domain-driven-design microservices cqrs event-sourcing
3个回答
0
投票

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

使系统交互以检索数据并非不可能,但这确实在较低的水平上将它们耦合在一起。


0
投票

当一项服务中的数据需要另一项服务中的数据时,如何获得此数据?

您复制它。

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

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

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

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

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


0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.