CQRS 解决了哪些持久性问题?

RPM*_*984 1 domain-driven-design read-write cqrs

我读过一些与此相关的帖子,但我仍然不太明白它是如何工作的。

举例来说,我正在构建一个像 Stack Overflow 这样的网站,有两个页面 => 一个列出所有问题,另一个页面供您提出/编辑问题。一个简单的、基于 CRUD 的 Web 应用程序。

如果我使用 CQRS,我将拥有一个单独的读/写系统、单独的数据库等......太棒了。

现在,我的问题是如何更新读取状态(毕竟在它自己的数据库中)。

我认为流程是这样的:

WebApp => User submits question WebApp => System raises 'Write' event WriteSystem => 'Write' event is picked up and saves to 'WriteDb' WriteSystem => 'UpdateState' event raised ReadSystem => 'UpdateState' event is picked up ReadSystem => System updates it's own state ('ReadDb') WebApp => Index page reads data from 'Read' system

假设这是正确的,这与从同一数据库读取/写入的 CRUD 系统有何显着不同?抛开 CQRS 的优点(例如单独的读/写系统扩展、重建状态、域边界分离等),从持久性的角度来看,可以解决哪些问题?避免了锁争用?

我可以通过使用队列在多线程 Web 应用程序中实现单线程保存,或者简单地在读/写数据库之间复制数据来实现类似的优势,不是吗?

基本上,我只是想从务实的角度了解我是否正在构建基于 CRUD 的 Web 应用程序,为什么我会关心 CQRS。

谢谢!

Gol*_*den 5

\n

假设这是正确的,这与从同一数据库读取/写入的 CRUD 系统有何显着不同?抛开 CQRS 的优点(例如单独的读/写系统扩展、重建状态、域边界分离等),从持久性的角度来看,可以解决哪些问题?避免了锁争用?

\n
\n\n

这里的问题是:

\n\n
\n

“抛开CQRS优势\xe2\x80\xa6”

\n
\n\n

如果你去掉它的优点,就很难争论它解决了什么问题;-)

\n\n

理解 CQRS 的关键是将读取数据与写入数据分开。这样您就可以根据需要优化数据库:您的写入数据库是高度规范化的,因此您可以轻松确保一致性。相比之下,您的读取数据库是非规范化的,这使得您的读取变得极其简单和快速:它们都变得SELECT * FROM \xe2\x80\xa6有效。

\n\n

假设像 StackOverflow 这样的网站的读取次数多于写入次数,这很有意义,因为它允许您优化系统以实现快速响应和出色的用户体验,同时又不会牺牲一致性。

\n\n

此外,如果与事件溯源相结合,这种方法还有其他好处,但对于单独的 CQRS 来说,仅此而已。

\n\n

无耻插件:我和我的团队创建了对 CQRS、DDD 和事件溯源的全面介绍,也许这也有助于提高理解。详情请参阅本网站。

\n