Dino Esposito 在 MSDN 杂志上所发表的三篇系列文章中表示:命令查询职责分离(CQRS)架构是系统架构变革的一个起点,它将对整个架构带来深远的影响。CQRS 是软件架构师的设计理念从“需要持久化的模型”逐渐演变为“需要进行日志记录的事件”的第一步。在他看来,软件架构在今后数年将成为人们的主要关注点,而主要的数据源将来自于基于事件的数据,而不是数据的快照。
Esposito 从 2006 年至今一直保持着微软MVP 的荣誉,他将CQRS 描述为能够区分修改状态的代码与读取状态的代码的一种设计风格。他强调说:一旦认识到命令与查询是两种截然不同的操作,对于软件架构设计的想法就可能带来重大的影响,系统的每个部分都会变得更容易理解与编码。其中命令部分将关注于业务规则,而查询部分则只需要考虑如何返回数据。两者各自的处理管道也能够进行分别优化,而不会产生破坏对方的功能的风险。CQRS 的最基本形式是在一个数据库中实现读写分离,但也存在着一些更高级的表现形式,Vladimir Khorikov 曾专门撰文讨论过这一话题。
Esposito 也表示,许多开发者倾向于仅在具有高度协作性以及大规模的应用中使用 CQRS。但在他看来,无论系统表现出怎样的复杂度,这种软件开发方式都能够体现出其价值所在。虽然在具有高度复杂性的业务中,CQRS 能够更好地表现出其优势,但他认为即使在一些普通的应用,例如基于 CRUD 的应用中,CQRS 同样也是一种简单而强大的模式。
Esposito 认为,基于消息的架构的主要优势在于:在支持一些新的用户场景时,它能够简化对复杂性的管理以及业务工作流的变更。他也提到,如果不使用 CQRS 而打造一个基于消息的系统是非常困难、甚至是不可能的。通过使用领域事件,可以将工作流建模为一个个独立的操作(由命令触发)以及事件。通过创建处理器对命令以及后续的事件进行处理,整个工作流就被分解为多个小步骤,从而简化工作流的变更。
Esposito 注意到 CRUD 系统的一个特征在于数据总是以快照的形式保存起来的,亦即最近的已知系统状态,而这一点往往被人忽略。如果客户提出了某个特性,需要获得应用在过去某个阶段的状态,那么仅仅保存快照数据是无法满足这一需求的。在他看来,这种情况下唯一的解决方案就是重新修改系统的架构,让它保存领域事件,并保存整个领域中所有的变更记录。将数据保存为事件能够降低数据的抽象级别,设计者就有机会将相同的数据用于不同的目的,包括单纯的查询、商业智能以及系统使用情况分析。
评论