在 CQRS 中设计查询层

Designing the query layer in CQRS

我一直在研究微服务,尤其是 this video 提出的 CQRS 模式。我认为命令部分对我来说很容易理解,只要我接受最终的一致性并接受它。但是,当您使用 API 对非规范化查询层执行简单查询时会发生什么。我这样想是因为您可能会在查询正确时将非规范化数据延迟加载到查询层?特别是如果您要查询的数据实际上是分散在所有微服务中的数据的聚合,您是否必须求助于使用某种上下文 ID 触发获取数据事件的大规模编排,然后所有微服务依次发布它们的数据相同的上下文 ID,以便反规范化器可以侦听聚合数据并将其填充到其层,并最终响应客户端?

你描述的其实是API构图模式-https://microservices.io/patterns/data/api-composition.html

在 CQRS 中,一个单独的数据库将用于查询。结果将直接从此专用数据库中检索。

CQRS 通常与事件溯源模式相结合。 (https://microservices.io/patterns/data/event-sourcing.html) 这意味着系统中的任何状态变化都将由一个事件来表示。

在查询service/logic中,您需要订阅所有感兴趣的事件,并在事件处理程序中相应地更新查询数据库中的数据。这样query DB中的数据最终和command-side DB中的数据是一致的。
(https://microservices.io/patterns/data/cqrs.html)

CQRS 使查询 easier/more 变得高效并改进了关注点分离。 但是,如您所见,它的实现比 API 组合更复杂,并且它有一个先天问题——复制滞后——查询数据库中的数据可能无法反映最新状态。所以一般建议尽可能使用API组合,只有在必须的时候才使用CQRS。