Domain driven design CQR解决了哪些持久性问题?

Domain driven design CQR解决了哪些持久性问题?,domain-driven-design,cqrs,read-write,Domain Driven Design,Cqrs,Read Write,我读过一些与此相关的帖子,但我仍然不能完全理解它是如何工作的 比如说,我在构建一个类似Stack Overflow的网站,有两个页面=>一个列出所有问题,另一个页面用于提问/编辑问题。一个简单的、基于CRUD的web应用程序 如果我使用CQR,我会有一个单独的读/写系统,单独的数据库,等等。太好了 现在,我的问题是如何更新读取状态,毕竟它是在自己的数据库中 我假设流是这样的: WebApp=>用户提交问题 WebApp=>系统引发“写入”事件 WriteSystem=>“Write”事件被拾取

我读过一些与此相关的帖子,但我仍然不能完全理解它是如何工作的

比如说,我在构建一个类似Stack Overflow的网站,有两个页面=>一个列出所有问题,另一个页面用于提问/编辑问题。一个简单的、基于CRUD的web应用程序

如果我使用CQR,我会有一个单独的读/写系统,单独的数据库,等等。太好了

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

我假设流是这样的:

WebApp=>用户提交问题 WebApp=>系统引发“写入”事件 WriteSystem=>“Write”事件被拾取并保存到“WriteDb” WriteSystem=>UpdateEstate事件已引发 ReadSystem=>“UpdateEstate”事件已拾取 ReadSystem=>系统更新自己的状态“ReadDb” WebApp=>索引页从“读取”系统读取数据

假设这是正确的,那么这与CRUD系统从同一个DB读/写有什么显著不同?抛开CQR的优势(如独立的读/写系统扩展、重建状态、分离域边界等),从持久性的角度来看,解决了哪些问题?避免了锁争用

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

基本上,我只是想从实用的角度理解,如果我正在构建一个基于CRUD的web应用程序,为什么我会关心CQR


谢谢

这取决于您的应用程序需要

这里有一个很好的概述和指向更多资源的链接:

何时使用此模式:

在以下情况下使用此模式:

在同一数据上并行执行多个操作的协作域。CQRS允许您使用定义命令 足够的粒度以最小化域级别的合并冲突 任何确实发生的冲突都可以由命令合并,即使在 更新看似相同类型的数据

基于任务的用户界面,其中用户通过一系列步骤或复杂的域模型引导完成复杂的流程。 此外,对于已经熟悉领域驱动设计的团队也很有用 DDD技术。写入模型具有完整的命令处理堆栈 使用业务逻辑、输入验证和业务验证 确保每个集合的所有内容始终一致 将关联对象的每个集群视为数据的一个单元 写入模型中的更改。读取模型没有业务逻辑或逻辑 验证堆栈,只返回一个DTO以在视图模型中使用。这个 读模型最终与写模型一致

数据读取性能必须与数据写入性能分开进行微调的场景,特别是当 读/写比率非常高,并且当水平缩放 必修的。例如,在许多系统中,读取操作的数量 是写操作数的许多倍。到 容纳这个,考虑扩展读取模型,但是运行 只在一个或几个实例上编写模型。少量的书写 模型实例还有助于最小化合并的发生 冲突

一个开发团队可以专注于作为编写模型一部分的复杂域模型,而另一个团队可以 关注阅读模型和用户界面

系统预计会随着时间的推移而发展,可能包含模型的多个版本,或者业务规则 定期更换

与其他系统的集成,尤其是与事件源的组合,其中一个子系统的暂时故障不应 影响其他人的可用性

在以下情况下不建议使用此模式:

其中域或业务规则很简单

一个简单的CRUD风格的用户界面和相关的数据访问操作就足够了

用于整个系统的实施。总体数据管理场景中有一些特定的组件,其中可以使用CQR 它很有用,但在使用时会增加相当大的不必要的复杂性 这不是必需的


这取决于您的应用程序需要

这里有一个很好的概述和指向更多资源的链接:

何时使用此模式:

在以下情况下使用此模式:

在同一数据上并行执行多个操作的协作域。CQRS允许您使用定义命令 足够的粒度以最小化域级别的合并冲突 任何确实发生的冲突都可以由命令合并,即使在 更新看似相同类型的数据

基于任务的用户界面,用户可以通过一系列复杂的过程进行引导 步骤的或复杂域模型的。 此外,对于已经熟悉领域驱动设计的团队也很有用 DDD技术。写入模型具有完整的命令处理堆栈 使用业务逻辑、输入验证和业务验证 确保每个集合的所有内容始终一致 将关联对象的每个集群视为数据的一个单元 写入模型中的更改。读取模型没有业务逻辑或逻辑 验证堆栈,只返回一个DTO以在视图模型中使用。这个 读模型最终与写模型一致

数据读取性能必须与数据写入性能分开进行微调的场景,特别是当 读/写比率非常高,并且当水平缩放 必修的。例如,在许多系统中,读取操作的数量 是写操作数的许多倍。到 容纳这个,考虑扩展读取模型,但是运行 只在一个或几个实例上编写模型。少量的书写 模型实例还有助于最小化合并的发生 冲突

一个开发团队可以专注于作为编写模型一部分的复杂域模型,而另一个团队可以 关注阅读模型和用户界面

系统预计会随着时间的推移而发展,可能包含模型的多个版本,或者业务规则 定期更换

与其他系统的集成,尤其是与事件源的组合,其中一个子系统的暂时故障不应 影响其他人的可用性

在以下情况下不建议使用此模式:

其中域或业务规则很简单

一个简单的CRUD风格的用户界面和相关的数据访问操作就足够了

用于整个系统的实施。总体数据管理场景中有一些特定的组件,其中可以使用CQR 它很有用,但在使用时会增加相当大的不必要的复杂性 这不是必需的


一个好的起点是回顾,他试图澄清CQRS模式的有限范围

CQRS只是在以前只有一个对象的情况下创建两个对象。。。。然而,这种分离使我们能够在架构上做许多有趣的事情,最大的一点是它迫使智力迟钝的打破,因为两者使用相同的数据,所以它们也应该使用相同的数据模型

多数据模型的想法是关键的,因为现在你可以开始考虑使用适合于目的的数据模型,而不是尝试将单个数据模型调整到你需要支持的每种情况下。 一旦我们认为这两个物体在逻辑上是分开的,我们就可以开始考虑它们是否是物理上分开的。这开启了一个有趣的权衡世界

从持久性的角度来看,解决了哪些问题

选择适合用途的存储的机会。您不再在单个读/写持久性存储中支持所有用例,而是从键值存储中提取文档,从图形数据库中运行图形查询,从文档存储中运行全文搜索,从事件流中运行事件


或者不是!如果成本效益分析告诉您,这项工作不会有回报,您可以选择从一家商店为您的所有案例提供服务。

一个好的起点是回顾,他试图澄清CQRS模式的有限范围

CQRS只是在以前只有一个对象的情况下创建两个对象。。。。然而,这种分离使我们能够在架构上做许多有趣的事情,最大的一点是它迫使智力迟钝的打破,因为两者使用相同的数据,所以它们也应该使用相同的数据模型

多数据模型的想法是关键的,因为现在你可以开始考虑使用适合于目的的数据模型,而不是尝试将单个数据模型调整到你需要支持的每种情况下。 一旦我们认为这两个物体在逻辑上是分开的,我们就可以开始考虑它们是否是物理上分开的。这开启了一个有趣的权衡世界

从持久性的角度来看,解决了哪些问题

选择适合用途的存储的机会。您不再在单个读/写持久性存储中支持所有用例,而是从键值存储中提取文档,从图形数据库中运行图形查询,从文档存储中运行全文搜索,从事件流中运行事件

或者不是!如果成本效益分析告诉您,这项工作不会有回报,那么您可以选择从一家商店为您的所有案例提供服务

假设这是正确的,这与 CRUD系统从同一数据库读/写?抛开CQR的优势(如独立的读/写系统扩展、重建状态、分离域边界等),从持久性的角度来看,解决了哪些问题?避免了锁争用

这里的问题是:

抛开CQRS的优势不谈

如果你拿走了它的优点,就有点难以争论它解决了什么问题-

理解CQR的关键在于将读取数据与写入数据分开。通过这种方式,您可以根据需要优化数据库:您的写数据库是高度规范化的,因此您可以轻松确保一致性。相比之下,您的读取数据库是非规范化的,这使得您的读取非常简单和快速:它们都成为有效的SELECT*FROM

假设StackOverflow这样的网站读起来比写上去要多,这是非常有意义的,因为它允许您优化系统以获得快速响应和良好的用户体验,同时又不牺牲一致性

此外,如果与事件来源相结合,这种方法还有其他好处,但仅对CQR而言,就是这样

无耻的插件:我和我的团队对CQR、DDD和事件来源做了全面的介绍,也许这也有助于提高理解。有关详细信息,请参阅

假设这是正确的,那么这与CRUD系统从同一个DB读/写有什么显著不同?抛开CQR的优势(如独立的读/写系统扩展、重建状态、分离域边界等),从持久性的角度来看,解决了哪些问题?避免了锁争用

这里的问题是:

抛开CQRS的优势不谈

如果你拿走了它的优点,就有点难以争论它解决了什么问题-

理解CQR的关键在于将读取数据与写入数据分开。通过这种方式,您可以根据需要优化数据库:您的写数据库是高度规范化的,因此您可以轻松确保一致性。相比之下,您的读取数据库是非规范化的,这使得您的读取非常简单和快速:它们都成为有效的SELECT*FROM

假设StackOverflow这样的网站读起来比写上去要多,这是非常有意义的,因为它允许您优化系统以获得快速响应和良好的用户体验,同时又不牺牲一致性

此外,如果与事件来源相结合,这种方法还有其他好处,但仅对CQR而言,就是这样


无耻的插件:我和我的团队对CQR、DDD和事件来源做了全面的介绍,也许这也有助于提高理解。有关详细信息,请参阅。

假设这是正确的,但这并不完全正确。我可以根据CQRS对您的问题进行编辑以正确建模吗?假设这是正确的-但并不完全正确。我可以根据CQRS编辑您的问题以正确建模吗?谢谢您的回答+1.“搁置优势”这句话的原因是我试图理解持久性的好处,而不是其他好处。标准化/非标准化点是一个很好的点。这可能是吹毛求疵,但锁争用又如何呢?在需要更新状态之后,还需要向非规范化读取存储写入一些内容,对吗?我能不能用SQL server复制之类的东西得到同样的结果,它会在退出时对数据进行非规范化处理?当然。没有人说它需要两个数据库,您也可以使用一个数据库,只需要两个表。这里的重点是从概念上区分阅读和写作,而不是从技术上。但是,只有在技术上把它们分开的情况下,你才能获得所有其他好处。谢谢你的回答+1.“搁置优势”这句话的原因是我试图理解持久性的好处,而不是其他好处。标准化/非标准化点是一个很好的点。这可能是吹毛求疵,但锁争用又如何呢?在需要更新状态之后,还需要向非规范化读取存储写入一些内容,对吗?我能不能用SQL server复制之类的东西得到同样的结果,它会在退出时对数据进行非规范化处理?当然。没有人说它需要两个数据库,您也可以使用一个数据库,只需要两个表。这里的重点是从概念上区分阅读和写作,而不是从技术上。但是,只有在技术上将它们分开的情况下,您才能获得所有其他好处。