1、首先CQRS在存储了事件流以后,还需要将事件结果同步到查询数据库里,而这个同步过程,我的理解应该是从事件仓储中取出事件流进行模型的重新推演,再把结果ORM或SQL CRUD到查询数据库中,但事实上这个事件流在用户发起请求并得到结果期间,已经进行过一次,并将结果告知了用户,既然同样是要把事件顺序运行的结果保存到查询数据库中,为什么不直接将第一次的领域结果状态保留下来呢?难道重新查找事件并演算领域结果状态,要比传达一个领域的完整状态开销更小吗?
如果是要为了解耦,我觉得也牵强,因为将事件最终结果推向一条总线,并不见得比一串事件推向一条总线更不合理。
这个问题的前题是我们确实需要一个查询数据库,并满足用户诸如:查找30天内回贴量超过10个的贴子。这样的需求,显然不能靠纯事件流仓储去得到结果。
2、接下来的疑问就是事件仓储的存在价值了。仍然以论坛贴子为例,在论坛这个需求里,恐怕用户更关心这个贴子现在的内容,回了多少贴,总评价如何,回复了什么内容。而不是关心这个贴子冗长的回复过程,评分过程。这说明事件的保存价值不大,恐怕无论是版主还是用户都没什么兴趣去重放贴子的发展经历吧... 这些事件的价值也不是完全没有,就是出BUG的时候能够重放一下,找出错误原因,修正代码,然后进行一次完整重放得到正常数据,但如一个异常牵扯的领域太多,如一个订单对商品对商家对支付对优惠折扣之类的影响,经历的事件太多,我觉得这样大面积地重放正常领域事件(如订单牵涉到的一件商品)去修复一个数天前的异常订单,风险就太大了,还牵涉到第三方合作的数据记录问题。而且要准确重放还需要停下服务,不要让新的事件在得到正确结果继续加入。复杂性很让人头痛啊。
纵观常规应用的需求,对结果状态的需求,远多于对事件规迹的需求啊。
希望能就这两个疑问进行交流
[该贴被ahyyxx222于2011-12-11 12:02修改过]
[该贴被ahyyxx222于2011-12-11 12:05修改过]
[该贴被ahyyxx222于2011-12-11 12:12修改过]