以 CQRS 模式加入来自不同微服务的数据

Join data in CQRS patterns from different microservices

我想在项目中应用 CQRS 模式,但我不明白如何 加入反规范化 数据。

考虑一个数据模型,其中有 2 个实体:ProductStore 处于多对多关系中,属性名为 库存(特定商店中的产品数量)作为关系属性。

还要考虑一下我已经创建了 2 个微服务:

此时,我想创建第三个微服务,负责加入 ProductService 和 StoreService 的数据,以便检索所有可用的产品。在这里,CQRS 模式似乎是最好的解决方案:我将创建一个物化视图,并使用其他 2 个微服务发布的域事件来同步它。太棒了!

现在的疑惑.

假设物化视图有以下列:

product_sku, product_name, 股票, store_name, store_address.

当我更新 Product 实体或 Store 实体时,同步视图没有问题,因为我已经有数据了。但是当我收到 ProductCreated 事件时呢?此事件只有产品信息,没有其他信息,因此库存、store_name、store_address 将为 NULL。如何在我的视图中保存此事件?我是否应该将不完整的数据保存在其他地方并在收到完整数据时更新我的​​视图?

谢谢!

CQRS、事件溯源和物化视图

你是对的,一般来说 CQRS ,物化视图与事件源模式一起使用。这意味着我们继续将我们的事件添加到事件存储中(这是单点事实)。我们通过调度将从事件存储和 create/update 实体化视图中读取数据的作业来生成实体化视图,或者我们可以在事件触发器之后生成实体化视图。因此,当您获得商店服务事件(可能在产品事件之后)时,您就知道这是特定事务的最后一个事件,并且查询事件存储更新物化视图,您将拥有所有数据。简而言之,继续在事件存储中转储并立即查询您的事件存储以更新您的物化视图。添加事件源本身可能很复杂,所以如果没有它也可以管理,请不要过于复杂。

您的情况

如果您不使用事件存储,那么在您的情况下,您将 partial/incomplete 信息保存在实体化视图中,并在其他飞行事件到达时不断更新它。您将有一个 reference/key,您将在实体化视图中更新您的数据。由于整个系统最终是一致的,您将不得不管理您希望如何在前端显示不完整(如果必须)数据,或者如果您不想显示,您可以标记它(在最后一个事件到达时取消标记并且信息是完成)。

Materialized view