1

我在电子商务应用程序上工作。我使用带有 ddd 的微服务。我有产品服务。它存储标题描述等。定价服务存储产品价格和促销。类别服务商店类别和产品类别。装运服务存储所有关于装运数据和产品装运细节的货物运输公司 isFreeCargo 等。

我不想使用组合模式进行搜索。我创建了存储所有服务数据的搜索服务。定价、产品信息、发货信息、类别信息等。我将所有数据与事件联系起来。就像 cQRS 一样,所有服务都通过事件相互通信。

我的问题是;当 CreateProductRequest 来到产品服务。它包括 categoryId、price、shippingFirm 等。我的意思不仅仅是产品服务信息。我只在产品服务中保存标题描述等。产品服务中没有价格或类别等数据。因为他们不属于这个域。当产品创建和事件引发 productCreatedEvent 包括创建的产品 id 和其他服务信息时, request.price , category 等。

其他服务监听这个事件。并消费。定价保存 productId 和 price。Cagegory 保存 productId 和 categoryId ...

搜索服务也消费事件。但是没有关于价格或类别的数据,因为它们刚刚发布。Okey 我可以在价格变化或类别保存后证明与事件的一致性。但起初可能不会有 2-3 秒的价格或类别。如何立即保存搜索服务的类别和价格。因为 productCreatedEvent 中没有价格和类别非规范化和计算数据。只有 categoryId 之类的参考 Id 或未计算价格。在自己的服务保存和发布 ProductCategoryUpdated 或 ProductPriceCaculeted 等事件后,它们将存在于搜索服务上

.

4

1 回答 1

0

首先。我可以看到价格和类别服务与产品非常相关,它们本身并没有强大的功能,所以我建议您将它们三者合并为一个服务。如果使用价格服务来创建促销,我会做一个促销服务,它与产品服务通信,询问产品或产品类别的价格,并应用相应的折扣。

第一个问题和我刚才说的有关,因为价格、品类和产品关系很大,你在创建产品的时候必须传递所有数据,但是因为它们是不同的服务,产品服务不应该意识到这一点信息。如果您想这样做,您应该独立于产品创建价格和类别,并且在创建这些价格和类别时,每个服务都应该发送一个 priceCreated 或 categoryCreated 事件,任何有兴趣的人都会使用该事件。例如搜索服务。

对于第二个问题,我认为最好的方法是第一个,第一个是因为它不会耦合服务。购物车服务只有 id 没有其他信息。而当您想查询其他信息时,您只需像往常一样查询正确的服务,因此不会创建耦合。其次,第二个选项的主要缺点是您将与购物车服务相关的逻辑包含在所有其他服务中。对于每个人,您必须监听事件,而不是像更新某些信息那样制作与服务相关的逻辑,而是将信息发送到另一个服务。它就像一个隐藏的命令消息

于 2020-06-15T07:16:27.290 回答