CQRS 和微服务中的数据管理

Posted

技术标签:

【中文标题】CQRS 和微服务中的数据管理【英文标题】:Data management in CQRS and Microservices 【发布时间】:2020-03-04 10:03:49 【问题描述】:

我是微服务架构的新手,我在此文档 http://microservices.io 之后学到了很多关于它的基础知识、CQRS 和事件溯源,但我还有一些问题对我来说仍然不清楚:

    是否需要为每个 CQRS 读取模型设置不同的数据库服务器,或者可以将它们放在同一个数据库中但在不同的表中。

    如果您有不同的数据库,那么您应该如何连接表。如果我们使用相同的数据库,那么我们的微服务不会紧密耦合,这将破坏使用这种架构的全部目的

【问题讨论】:

您可以将它们放在同一个数据库中,或者您可以将您的查询模型放在缓存层中。这样想,您的“查询”模型是数据的复制形式——可能是最新的,也可能不是。 【参考方案1】:

是否需要为每个 CQRS 读取模型设置不同的数据库服务器,或者可以将它们放在同一个数据库但在不同的表中。

您通常会期望不同的逻辑数据库。它们可能碰巧托管在同一个持久存储设备上,但任何代码都不应期望将数据存储在同一个位置。

如果你有不同的数据库,那么你应该如何加入表。

您应该加入表格。相反,您复制数据——从对写入有意义的表示转换为对读取有意义的表示。

如果我们使用相同的数据库,那么我们的微服务不会紧密耦合,这会破坏使用这种架构的全部目的

这种耦合实际上来自于假设不同的服务接触相同的。换句话说,我们不希望进程通过数据库通信。相反,我们在服务之间传递消息,服务管理自己的数据。

如果你做对了,那么你碰巧将这些数据存储在同一个设备中这一事实就无关紧要了,因为你的服务实际上永远不会脱离它们自己的小气泡。

表达相同想法的另一种方式:您应该能够更改“您的”架构,而无需与其他任何人协调。

假设我们有一个用户微服务和一个帖子微服务,我应该如何查询发布它们的每个用户的帖子,我如何管理不同微服务之间的相关数据?

您将数据复制到一个公共数据库,然后您可以在其中创建您需要的报告。

【讨论】:

知道了!但是假设我们有一个用户微服务和一个帖子微服务,我应该如何查询每个发布它们的用户的帖子,我如何管理不同微服务之间的相关数据?【参考方案2】:

命令查询职责分离 (CQRS) 是一种模式,您可以将用于更新的模型与读取数据的模型分开。这意味着您的微服务的读取端将是高度专业化和独立的。

所以谈到阅读方面,您可以拥有任意数量的数据库,通常,根据您需要执行的数据类型和查询,您拥有一个专门且优化的数据库。例如,您可以使用 Elastsearch 进行快速搜索,或使用 Neo4J 进行图形结构。

这些数据库是由你的微服务发布的Events更新的,所以你不用在不同数据库之间连接表,它们是独立的。

无论您是否为每个微服务使用关系数据库并使用Query 服务来连接来自多个数据库的数据,这都是一种反模式,它会在服务之间创建一对并受到锁表的影响。

【讨论】:

以上是关于CQRS 和微服务中的数据管理的主要内容,如果未能解决你的问题,请参考以下文章

现有关系数据库中的Cqrs和事件源

微服务中数据CQRS操作的事务处理

存储库如何适应 CQRS?

基于CQRS的架构在答题PK小游戏中的实践案例

如何实现 CQRS 以及在哪里创建读取数据库

流数据的 CQRS