SQL: Synchronize Read/Write Databases in CQRS, Asp.净的核心



我正在阅读DDDCQRS(使用Asp。网络核心,),以及它们不同的方法,然后我读了一个关于分离读写数据库的主题。,所以我开始在网上搜索如何做到这一点,如何同步这些数据库,但遗憾的是(也许我搜索错了)我没有找到任何好的资源来找到如何做到这一点。

我的问题是:

我应该如何分离这些数据库,然后我应该如何在它们之间同步数据,例如我有一个名为"User"现在,如果我在写db的写表中添加一个新行,我必须告诉读db与写db同步,这样我就可以在那里查询和使用新数据,但是怎么做呢?我也读了一些关于事件来源模式的内容或者事件驱动架构,但他们没有帮我找到如何同步。

所以有人知道怎么做或者有关于这个话题的任何好的资源可以帮助dummy:)

(考虑到你是在为一个第一次学习的人解释!)。

谢谢!

我有一个相关的答案,可以提供一些如何处理CQRS的背景。

要记住的重点是"写"字。一方关注更改/事务(OLTP)和"读取"。side与查询(OLAP)有关。

如何更新你的"阅读"Side(读模型)将取决于你如何编写"写"方面的变化。当使用事件存储时,事情可能会更容易,因为每个事件都有一个全局序列号,并且每个投影(读取模型)根据全局序列号跟踪它所在的位置。因此,当新事件到达时(投影轮询),如果事件适用于投影,则可以对它们进行操作。

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

正如@Levi Ramsey所提到的,读模型通常与写模型有很大的不同,因为它是为读而优化的,所以它可能包含非规范化的数据,或者只是在更适合读模型的数据存储中。

CQRS的主要优点是能够使用不同的数据模型和/或不同的数据库进行查询和更新。如果他们使用相同的数据模型,通常没有太多的好处(至少不是像SQL Server这样的数据库,在大多数规模上,两者都是合理的)CQRS。

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

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

最新更新