CQRS + ES:将整体拆分为微服务数据库问题

CQRS + ES: Splitting monolith to microservices database issue

当我们使用关系数据库做多table子查询时,例如

select * from `t_a` a where exist (select pid from` t_b` b where b.pid = a.pid group by pid)

如果table、t_a、t_b在同一个数据库中,那么子查询就很容易实现了,如果我们将这两个table拆分(更多超过数百万行)分成两个微服务 A 和 B,服务 A 有数据库 db_a,它有 table t_a,服务 B 有数据库 db_b,它有 table t_b.

我的问题是:CQRS & ES是如何实现数据聚合的?

这个问题我纠结了好久,找了那么多文章,没找到有用的答案,不胜感激。

在 CQRS+Event sourcing 中,您不一定需要任何连接。为什么?见下文。

在写入端,您拥有通过重播之前的事件从事件存储中重新水合的聚合,因此没有连接。

在阅读方面,您有 readmodels/projection 和 sagas。在这里,您对数据进行非规范化。您将模型设计为包含客户所需的所有数据。例如,在博客中 post 的评论列表中,您还放置了作者的用户名及其 ID。通过这种方式,您不需要从用户 table 获取数据,因为数据已经存在(您也不需要通用用户 table )。

存在数据新鲜度问题。您通过监听相关事件来保持 related/denormalized 数据新鲜。对于我们的示例,您的 readmodel 侦听 UsernameWasChanged 事件并更改其所有 post 的用户名。

CQRS 使连接过时。