2015-05-19 31 views
0

在正确设计的应用程序中,可能会将所有请求分开(仅更新聚合并返回void)和查询(从特定的读取优化模型中提取数据)。如何使用CQRS处理MixedQuery?

但是,如果您已经有一个沉重的应用程序,并且想要慢慢将其移至ES + CQRS路径,则可能会请求修改和更新模型并返回所有结果(如果执行了命令然后查询但这将是2请求)这就是我的意思是混合查询。

我明白,这显然是teoretical的问题,我没有这里的任何代码来说明,但

你如何处理与CQRS这样的要求?

+0

这比CQRS更接近CQRS吗? – guillaume31

+0

它不是,但我做的是devide成小项目,小的独立模块和现在我想重构/与CQRS重新设计了相当多的事情要做。但是现在我在理解它是否能够在实际迁移之前处理我想要使用它的一些问题。 – vach

回答

1

看来你基本上是在谈论牺牲Command-Query Separation,这是CQRS的一个先决条件,也是一个很好的开发实践。

如果我要转移到CQRS方法,我会开始通过符合CQS(如果有的话),在引入整个CQRS设备之前,从方法级别分离命令。

您不必将它作为大爆炸重做,您可以通过功能切片进行功能切片,确保您具有高级自动化测试以确保重构。

+0

确定只是忘了大项目,说我从头开始写作,我的虚拟系统有功能来创建一个新的用户...你如何做到这一点与适当的deisnged CQRS应用程序? – vach

+0

只是抽象地描述,例如,客户端发送一个命令并立即发送一个查询吗?还是还有别的东西? 我不能前进,因为我可以看到真实世界中的大多数用例确实是混合查询... – vach

+0

我可以很好地看到,如果我唯一的后端正在启动对用户的任何更新,但它并非总是如此,那么它的性能会有多好... – vach

2

您的“混合查询”超出了CQRS的范围。我的答案是 - 如果你有这个,你没有CQRS。 CQRS的意思是命令和查询是分离,这是整个点。

您不必立即将所有内容移动到新模型,您将有两个平行系统并逐个移动到另一个。我强烈建议不要将旧东西混合到新模型中。

+0

例如从希望创建一个新用户的应用程序的简单请求,它至少应得到一些想法,如果整个事情了OK或者失败... 什么是做CQRS这种行为的正确方法?我认为这是一个很常见的例子... – vach

+0

我可以想到的解决方案,如果你有一个像websocket客户端全双工通信然后更新后读取模型它可以发送更新给用户,但我不认为这是大多数情况下应用程序... – vach

+1

该命令可能会因异常而失败,如果您的命令已完成,这将是一个很好的指示。在CQS命令中不返回任何东西,即状态变异方法总是无效的。当你的命令返回实际的聚合时,可以建立流畅的接口,这也可以。但CQRS“将一个对象拆分为两个”,因此写入模型不应该从读取模型中查询任何内容,并且肯定不应该返回任何查询结果。 –