Electronic Joint Business

Solution for E-Business

CQRS

设计模式之 CQRS 模式简介

用户和信息系统交互的主要行为就是对数据库或数据仓库进行 CRUD 操作,设计者通常为此构建出一个可供创建、读取、更新和删除的数据模型。该模型的接口就是供存储和获取数据之用的。但这种标准的分层体系结构并未处理两个问题:协作(collaboration)与失效(staleness)。1

协作是指多个参与者使用/修改相同的数据集的情况 — 尽管他们未必真的是相互协作。而失效是指在协作环境中,数据已显示给用户之后,相同的数据可能已经被另一个参与者修改 — 即数据失效了。出于性能使用缓存则进一步加剧了数据失效的问题。解决这两大问题,正是命令查询责任分离模式 (CQRS — Command Query Responsibility Segregation )背后的驱动力。

在图1-1 中,我们可以看到用户基本上会发起两类操作:命令(Command) 和查询(Query),如显示当季销量最好的产品属于查询,而提交订单、修改密码等则属于命令,也就是说:

  • 命令操作:用于修改单个对象或者整个系统的状态(有时也称为 modifiers 或 mutators).
  • 查询操作:用于返回结果且不改变对象状态

从事务的角度上看,查询操作与命令操作对事务的要求不一样。由于查询操作不会改变系统状态,因而,不会产生最终的数据不一致。从请求响应的角度来看,查询操作常常需要同步请求,实时返回结果;命令操作则不然,因为我们并不期待命令操作必须返回结果,这就可以采用fire-and-forget方式,而这种方式正是运用异步操作的前提。

对于大多数软件系统而言,查询操作发起的频率通常要远远高于命令操作。由于查询操作不会造成数据的修改,因而它属于一种幂等操作,可以反复地发起,而不用担心会对系统造成影响。基于这种特性,我们还可以为其提供缓存,从而改善查询的性能。命令操作则与之相反,它会直接影响数据的改变。

>>> 阅读全文

 

,