cqrs与cqs之间的差异

问题描述 投票:41回答:5

我正在学习什么是CQRS模式,并且开始知道还有CQS模式

当我试图搜索时,我发现了很多图表,关于CQRS的信息但是没有发现很多关于CQS的信息

CQRS模式的关键点

在cqrs中,有一个要编写的模型(命令模型)和一个要读取的模型(查询模型),它们是完全独立的。

enter image description here

CQS如何与CQRS区分开来。 。 ?

两者都有区别的关键点是什么。 。 ?

任何援助将不胜感激 :)

cqrs command-query-separation ncqrs
5个回答
53
投票

CQS(命令查询分离)和CQRS(命令查询责任分离)是非常相关的。您可以将CQS视为属于类或组件级别,而CQRS更多地处于有界上下文级别。

我倾向于认为CQS处于微观层面,而CQRS处于宏观层面。

CQS规定了用于查询或写入模型的单独方法:查询不会改变状态,而命令会改变状态但没有返回值。它由Bertrand Meyer设计,作为他在Eiffel编程语言方面的开创性工作的一部分。

CQRS规定了类似的方法,除了它更多的是通过您的系统的路径。查询请求从命令获取单独的路径。查询返回数据而不改变底层系统;该命令改变系统但不返回数据。

Greg Young汇总了几年前CQRS的pretty thorough write-up,并探讨了CQRS如何成为CQS的演变。几年前这份文件向我介绍了CQRS,我发现它仍然是一个非常有用的参考文档。


4
投票

最大的区别是CQRS使用单独的数据存储来执行命令和查询。查询存储可以使用不同的技术(如文档数据库),也可以只是同一数据库中的非规范化模式,这样可以更轻松地查询数据。

数据库之间的数据通常使用服务总线等异步复制。因此,查询存储中的数据最终是一致的(将在某个时间点存在)。应用程序需要考虑到这一点。虽然可以使用相同的事务(相同的数据库或两阶段提交)在两个存储中写入,但通常不建议出于可伸缩性的原因。

CQS体系结构从相同的数据存储/表中读取和写入。


3
投票

这是一个古老的问题,但我会采取措施回答它。我不经常回答有关StackOverflow的问题,所以请原谅我,如果我在社区范围之外做一些事情,那就是在链接到事物,写一个长答案等方面。

CQRS和CQS之间存在许多差异,但CQRS在其定义中使用CQS!让我们从定义两者开始,然后我们可以讨论差异。

CQS根据其返回值定义两种类型的消息。没有返回值(void)指定这是一个Command。返回值(非void)指定此方法是Query。

命令更改信息查询返回信息

命令改变状态。查询没有。

现在对于CQR​​S使用与CQS for Commands and Queries相同的定义。 CQRS所说的是我们不希望一个对象使用Command和Query方法。相反,我们需要两个对象,一个包含所有命令,另一个包含所有查询。

这个想法总体上非常简单,在事情变得有趣之后,这一切都很简单。网上有很多关于我讨论相关属性的讨论(抱歉在这里输入很多东西!)


3
投票

阅读发明家Greg Young的回答

我认为,就像“依赖注入”这样的概念是如此简单并且理所当然地认为它们具有奇特名称的事实似乎促使人们认为它们比它们更多,特别是因为CQRS经常被引用与事件采购一起。

  • CQS是将读取的方法分离为改变状态的方法;不要在一个方法中同时做到这两点。这是微观层面。
  • CQRS将此概念扩展到机器机器API的更高级别,消息模型和处理路径的分离。

因此,CQRS是您应用于API或外观中的代码的原则。

我发现CQRS在SOLID中基本上是一个非常强大的S,将分离深深地推向了开发人员的心灵,以产生更易于维护的代码。

我认为Web应用程序不适合CQRS,因为通过表示传输的状态变化意味着命令和查询是同一请求 - 响应的两个方面。表示是一个命令,响应是查询。

例如,您发送订单并接收所有订单的视图。

想象一下,如果网站的代码被考虑在命令端和查询端。路线动作处理代码需要落入其中一个方面,但它同时做到了。

想象一个更强大的隔离,如果代码被移动到两个不同的可编译代码库中,那么网站将接受表单的POST,但是用户必须浏览到另一个网站URL以查看该操作的影响。这显然很疯狂。一种解决方法是始终重定向,尽管这不是真正的REST,因为理想的REST应用程序是下一个表示包含超文本以驱动下一个状态转换的地方,依此类推。

鉴于网站是人与机器(或机器和机器)之间的REST API,这也包括REST API,尽管其他类型的HTTP消息传递API可能非常适合CQRS。

网站范围内的服务或门面显然可以与CQRS很好地协作,尽管动作处理程序将位于此边界之外。

CQS on Wikipedia


1
投票
  • CQS是关于命令和查询的。它不关心模型。您以某种方式分离了仅读取修改数据的数据和服务的服务。
  • CQRS是关于写入和读取的单独模型。当然,写模型的使用通常会读取某些内容以实现业务逻辑,但您只能对读取模型进行读取。单独的数据库是最先进的。但是想象一下,在OR / M中建模的单独数据库具有单独的读写模型。这通常是足够好的。

我发现人们经常说他们在拥有CQS时会练习CQRS。

© www.soinside.com 2019 - 2024. All rights reserved.