在 CQRS 中读取模型和关系数据

Read model and relational data in CQRS

我正在尝试熟悉 CQRS 和微服务架构,我知道 CQRS 包括将读取模型与域模型分开,并且您为每个读取模型提供了一个特定的数据库服务,以优化查询端。

但是作为一个只习惯于单体架构的人,我不明白如果关系数据存在于不同的服务中,你如何处理它们;比方说,我有一个用户微服务和一个带有读取模型的帖子微服务,我应该如何查询发布它们的每个用户的帖子,我如何管理不同微服务之间的相关数据?

I have a users microservice and a posts microservice with their read models, how am I supposed to query the posts with each user that published them, how can I manage related data between different microservices?

您将数据从拥有它的服务的持久存储复制到某个可以构建和更新您想要的视图的公共位置。

管道的一个简单实现可能是有一个按某个时间表触发的计时器,每次计时器触发时,您都会将更新的信息拉入您的视图,应用您可能需要的任何转换。

存在一些延迟,因为服务所做的更改传播到视图需要时间,但这是您在决定用户和帖子应单独提供服务时注册的一部分。

Let's say I have a view with the posts and the user's data needed. If the user updates his informations does this mean that I would have to update the data of each post published by that user?

"It depends"。例如,您可能正在将数据复制到关系数据库中:如果您的视图是由关系描述的,那么更新用户必然会更新所有视图的基础数据;数据库更新后构造的视图的任何表示都将具有新数据。

另一方面,如果您使用的是文档存储,那么您可能需要更新所有受影响的文档,或者将这些文档设计为与用户文档具有 link 关系。如果您考虑在 Web 上组合信息的不同方式,这可能会更清楚。