【问题标题】:SQL : Synchronize Read/Write Databases in CQRS , Asp.Net CoreSQL:在 CQRS、Asp.Net Core 中同步读/写数据库
【发布时间】:2021-08-12 13:50:09
【问题描述】:

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

所以这是我的问题:

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

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

(假设您是在为第一次学习它的人解释!)。

谢谢!

【问题讨论】:

    标签: sql sql-server asp.net-core domain-driven-design cqrs


    【解决方案1】:

    我有一个related answer,可以提供一些有关如何处理 CQRS 的背景信息。

    要记住的主要一点是,“写入”端涉及更改/事务 (OLTP),“读取”端涉及查询 (OLAP)。

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

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

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

    【讨论】:

    • 感谢您的回答,因为@Levi Ramsey 和您的帮助我理解了这个主题,现在我刚刚学到了关于这个概念的有用信息,感谢你们俩,请问您是否知道任何好的有助于实践这种方法的开源项目或示例项目?
    • 我有一个Identity and Access Management (IAM) 解决方案,用于我自己的项目。它有一个 Vue front-end。它实际上利用我的Shuttle.Recall 项目进行事件溯源/投影。欢迎您参考它,因为它实现了这些概念。但是,启动和运行可能需要一些努力,因为我还没有让它在野外松动:) --- 我会在某个阶段将它 dockerize。
    • 感谢您提及您的项目,我很高兴看到您提出学习的代码!顺便说一句,感谢@Eben Roux 的帮助。
    【解决方案2】:

    CQRS 的主要优势在于能够使用不同的数据模型和/或不同的数据库进行查询与更新。如果他们使用相同的数据模型,CQRS 通常不会有太大的好处(至少对于像 SQL Server 这样的数据库而言,在大多数情况下,这对两者来说都是合理的)。

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

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

    【讨论】:

    • 感谢您的回答,顺便说一句,我不知道您可以拥有两个具有不同数据库技术(例如 Mongo 和 MSSQL)的不同数据库来实现这种方法。无论如何,您知道或有任何示例或开源项目可以帮助我理解和实践这种方法吗?
    • 诚然不是 .Net(尽管 Akka 的很大一部分都有一个 .Net 端口),但 Akka 平台指南将介绍使用 cqrs 和事件源实现的示例系统(es 不是必需的cqrs:es 往往需要 cqrs,并且对 cqrs 有一定程度的机械同情)。 developer.lightbend.com/docs/akka-platform-guide/concepts/…
    • 感谢您的帮助! @Levi Ramsey
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 2018-08-16
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    相关资源
    最近更新 更多