CQRS 架构

CQRS 是一个读写分离的架构思想,全称是:Command Query Responsibility Segregation,即命令查询职责分离,表示在架构层面,将一个系统分为写入(命令)和查询两部分。一个命令表示一种意图,表示命令系统做什么修改,命令的执行结果通常不需要返回;一个查询表示向系统查询数据并返回。读写两边可以用不同的架构实现,方便实现 CQ 两端的分别优化。

CQRS 架构_第1张图片

CQRS 架构里通常读、写操作的是不同的存储系统,两个存储系统之间通过事件消息来进行同步。因为同步有一定延迟,所以 CQRS 的一致性模型是最终一致性。CQRS 架构适用于什么场景呢?

  1. 应用的读模型和写模型差别比较大。
  2. 单一的存储模型无法同时满足高性能的读和写需求。

在机票搜索业务中,因为机票报价数据量特别大,因此需要做数据库的分库分表。站在机票代理商角度看,应该以代理商维度分库,因为代理商操作报价的时候只修改自己的报价,代理商侧有读也有写,写操作(修改报价) QPS 不高,但每次操作的数据量很大。而站在用户角度看,应该以航线维度分库,因为用户关注的是搜索的航线的全部代理商报价。

针对这样两种完全不同的读写需求,非常适合使用 CQRS 架构来解决,采用两套 DB 来存储报价数据:一套以代理商维度分库,一套以航线维度分库。两者之间的数据同步,可以采用应用层发变更消息解决,也可以通过 Canal 监听 binlog 进行同步。变更消息一般发送到分布式消息队列里(比如 RocketMQ、Kafka),支持流量削峰,方便扩展。

你可能感兴趣的:(系统架构)