Domain driven design CQR如何为更具可扩展性的应用程序做出贡献

Domain driven design CQR如何为更具可扩展性的应用程序做出贡献,domain-driven-design,cqrs,Domain Driven Design,Cqrs,最近我读了很多关于CQRS架构的文章。关于为什么要使用CQR,最重要的一点是可伸缩性 现在我不太明白这是怎么回事 假设您有您的典型的CQRS应用程序设计 两个数据存储 一个是指挥部 一个用于查询端 处理命令后,将发送一个事件,该事件可能会更新第二个数据存储 人们经常说,拥有一个用于查询的数据存储和一个用于处理命令的数据存储将使您的应用程序更具可伸缩性。 但是,如果存储事件数据的第二个数据存储需要响应查询请求,并且还需要根据传入的事件不断更新iteself,那么该如何工作呢 为什么不在一个数据

最近我读了很多关于CQRS架构的文章。关于为什么要使用CQR,最重要的一点是可伸缩性

现在我不太明白这是怎么回事

假设您有您的
典型的
CQRS应用程序设计

  • 两个数据存储
  • 一个是指挥部
  • 一个用于查询端
  • 处理命令后,将发送一个事件,该事件可能会更新第二个数据存储
人们经常说,拥有一个用于查询的数据存储和一个用于处理命令的数据存储将使您的应用程序更具可伸缩性。 但是,如果存储事件数据的第二个数据存储需要响应查询请求,并且还需要根据传入的事件不断更新iteself,那么该如何工作呢


为什么不在一个数据存储中存储命令,并且查询端可以在其中重复使用存储的数据来获取其结果数据?

您可能会从他自己那里读到这篇文章,他解释了CQR的确切含义

CQRS不是关于拥有两个不同的商店,而是如Greg的文章所述:

CQRS只是在以前存在的位置创建两个对象 只有一个。分离是根据方法是否为 命令还是查询

您在这里描述的是更多的事件来源

现在回到您的问题:
CQR如何为更具可扩展性的应用程序做出贡献?
格雷格也回答说:

CQRS允许以不同方式承载两个服务,例如:我们可以承载 读服务在25台服务器上,写服务在两台服务器上。这个 命令和查询的处理基本上是不对称的 对称地扩展服务没有多大意义

就这样

这是带有ES(事件来源)的CQRS,不要混淆事情

事件源是关于存储通过处理传入命令引发的域事件。所以你可以随时播放它们。这使得读取端更加灵活,因为您可以随时更改读取数据库结构,之后只需重播域事件,而无需编写一些奇特的迁移代码。存储命令是不行的,因为您不一定有相同的环境(例如服务器上的不同时间),所以无法安全地重播它们。命令存储仅用于日志记录目的


命令和查询职责分离是将传入的请求分为两组:写入(命令)和读取(查询)。这背后的基本思想是,不必通过读取关系数据库和编写关系数据库来使用相同的ORM实体。因此,您可以通过读取来节省对象关系映射,这使事情变得更快。后来它进行了改进,现在这意味着您可以通过读取部分使用多个数据库,每个数据库特定于一组查询。例如,如果图形数据库(如neo4j)更适合某些查询,则可以添加neo4j数据库,而不是使用相同的关系数据库来服务这些查询。这可以让事情变得更快……

如果图形数据库(如neo4j)更适合某些查询,那么您可以添加一个neo4j数据库,而不是使用相同的关系数据库来服务这些查询。这可以让事情变得更快。。。真的!正如Greg Young所说,“错误的模型会导致巨大的意外复杂性”,ES与存储事件无关。它是通过应用事件来改变对象状态。没有ES,CQRS工作得很好。@MikeSW“ES不是关于存储事件。它是关于通过应用事件来改变对象状态。”-事实上你错了,我的意思是事件源是一种存储机制,它的工作方式与你我用不同的词描述的方式相同。“而且CQRS在没有ES的情况下工作得很好。”-没有人会这样说。“实现EventSourceDaggerGetRoot接口的聚合根可以存储在事件源存储库中。这些存储库不存储聚合本身,而是存储聚合生成的一系列事件。基于这些事件,可以随时恢复聚合的状态。“-来自”Axon框架提供了一些存储库实现,可以使用事件源作为聚合的存储方法。这些存储库要求聚合实现EventSourceDaggerGetRoot接口。与Axon中的大多数接口一样,我们还提供了一个或多个抽象实现来帮助您完成任务。"
Two Datastores
One for the Command Side
One for Query Side
When a Command has been processed an Event is send which could update the second Datastore