SQL:在 CQRS 中同步 Read/Write 数据库,Asp.Net 核心

SQL : Synchronize Read/Write Databases in CQRS , Asp.Net Core

我正在阅读 DDDCQRS(使用 Asp.Net Core ,MSSQL), 以及他们不同的方法,然后我阅读了一个关于 separating Read and Write Database 的主题,所以我开始在网上搜索如何同步这些数据库,但是可悲的是(也许我搜索错了)我没有找到任何好的资源来找到如何这样做。

所以这是我的问题:

我应该如何分离这些数据库,然后我应该如何同步它们之间的数据,例如我有一个名为“用户”的 table,它位于读写分离的数据库中,现在如果我向写入数据库中的写入 table 添加一个新行,我必须告诉读取数据库自行同步使用 write db 这样我就可以在那里获得新数据以供以后查询和使用,但是如何呢?我还阅读了一些有关 Event Sourcing PatternEvent-Driven Architecture 的内容,但它们没有帮助我了解如何同步。

所以任何人都知道如何这样做或有关于这个主题的任何好的资源可以帮助 dummy :)

(考虑到您正在为一个第一次学习它的人解释!)。

谢谢!

CQRS 的主要好处在于能够使用不同的数据模型 and/or 不同的数据库进行查询和更新。如果他们使用相同的数据模型,那么 CQRS 通常没有太多好处(至少对于像 SQL 服务器这样的数据库来说,在大多数规模上对两者都是合理的)。

这反过来意味着通常不可能让两个数据库自动同步,因为会涉及一些模型转换(例如从关系数据库(具有规范化模式),如 SQL 服务器到非规范化文档数据库,如 Mongo).

一个相当常见的模式是让写入数据库的软件也发布事件,描述更新到某个事件总线的内容。另一个软件订阅这些事件并对读取的数据库执行适当的更新。请注意,这意味着存在一段时间,其中针对读取 DB 和写入 DB 的查询将给出不同的结果。

我有一个 related answer 可以提供一些关于如何处理 CQRS 的背景知识。

要记住的要点是,“写入”端与 changes/transaction (OLTP) 有关,而“读取”端与查询 (OLAP) 有关。

如何更新“读取”端(读取模型)将取决于您如何更改“写入”端。使用事件存储时,事情可能会更容易,因为每个事件都有一个全局序列号,并且每个投影(读取模型)都会根据全局序列号跟踪它所在的位置。因此,当新事件到达(投影投票)时,如果事件适用于投影,则可以对它们采取行动。

如果您只是用 SQL 查询更新“写入”端,那么事情会有点不同,而且可能会很棘手,因为您没有任何机制来重播这些如果您希望进行更改,请更改读取模型。在这种情况下,您可以使用消息传递,并可能存储它们,或者对“读取”端和“写入”端进行更改……这并不理想;除非你需要 100% 的一致性。

正如@Levi Ramsey 所提到的,读取模型通常与写入模型有很大不同,因为它针对读取进行了优化,因此它可能包含非规范化数据,或者只是位于更适合的数据存储中阅读模型。