我目前正在研究一些符合CQRS模式的概念证明代码,我无法找到一个令人满意的解决方案来解决我认为我有的一个问题。
该系统根据特定的场景计算市场变化对给定投资组合的影响。
投资组合可以包含从一个到数百个持有和市场场景是预先定义或由用户为一个特定的要求即时定义。
以最简单的形式,该问题的解决方案将是返回给定输入的一些值的服务,但在CQRS情况下,执行计算(域)的部分不应该由实际返回数据(查询)的部分调用。
考虑到像这样的系统很容易有几个投资组合,而且场景的数量也可能很高,我认为存储计算结果是没有意义的。
有人有解决这个问题的办法,或者可以为我指出解决类似这个问题的文章的方向?
发布于 2015-04-28 19:31:38
CQRS并没有说您应该预先计算写入端的所有内容.当系统的状态通过命令发生变化时,就会创建事件并进行投影,侦听这些事件,并创建一个可用于查询的模型。这个模型的外观和它的用途取决于你。您甚至可以创建一个完整的第三范式数据库表示的投影,如果您愿意的话。
如果在读边做这些计算会更实际,那么我认为这样做没有问题,只要失去计算的结果是可以的。
发布于 2015-04-28 19:26:53
对我来说,CQRS的重点是创建两个域模型。一个优化用于使用命令更新数据,另一个优化用于使用查询读取数据。查询不应明显改变系统。将计算结果存储在排序缓存中是查询域模型的实现细节。只要缓存在时间上失效,即查询端最终与命令端一致,您就没事了。当然,您应该控制在应用程序中有多少“最终”是可以接受的。
当您计算市场变化对投资组合的影响时,您正在针对查询域模型执行查询。我不认为为您感兴趣的场景创建查询类型有什么问题。
总之,我不认为你有什么问题。记住你可以(应该?!)在查询处理程序和/或查询域模型中隐藏计算的复杂性。
发布于 2016-12-17 20:27:47
IMHO的计算只需要在写模型中,如果这些计算的结果需要保持不变。不多也不差。
让我们使用(非常简化的)银行领域的例子:如果您的不变量声明您不能在帐户上提取比您应该计算的余额(即该帐户上的取款和存款的总和)更多的钱,并且可以存储它(如果您有某种汇总),以便能够检查取款量是否大于实际余额,但是如果您的系统没有这样的不变量,那么计算是不必要的,并且很有可能只为您的系统客户端计算余额。
我还意识到,实际上您可能会问,是否可以使用read进行这些计算(如果计算量很大)--这取决于这一点。大多数人会说,您不应该在写端使用read side,但就连Greg也曾说过,有时它是可以接受的。请记住,在写端使用read可能会使您的模型不一致,因为读取侧数据可能已经过时。
https://stackoverflow.com/questions/29926515
复制相似问题