架构模式 CQRS

本文我们聊聊 CQRS 这种架构模式。

CQRS 是用来解决什么问题的?

我们先看一个场景。

系统中的数据模型是按照实体以及关系进行设计的是吧。

image

例如电商系统,包含订单、用户、商品等等数据。

数据的变更操作、查询操作,都是基于这一套数据模型的。

但是,实际场景下的查询需求是多种多样。

例如这3类人群:

  • 商家

  • 买家用户

  • 电商运营人员

他们的数据视角是不同的,各自的关注角度不同,需要查询的数据就完全不同。

但数据模型是一套啊,怎么办?

是不是就需要做数据关联、构建临时数据集合等等复杂的操作啊。

基于一种数据模型,来实现 N 种视角的查询,既别扭又麻烦。

CQRS 是怎么解决的呢?

CQRS 的全称是:

Command Query Responsibility Segregation

意思是 命令查询职责隔离

命令是指 插入、修改、删除,就是更改数据的动作。

隔离之后,结构就变成了这样:

image

所以,CQRS 会有两个数据模型,一个命令模型,一个查询模型(可以有多个)。

命令模型的数据变更后,需要同步给查询模型。

这样做的核心目的就是:

让数据查询可以放飞自我

各种复杂的查询操作再也不用基于单一死板的存储结构了。

命令模型数据同步过来之后,查询模型可以根据自己的想法来重新组织数据结构,从而实现想怎么查就怎么查,简单高效。

这样就解决了以前单一数据模型带来的查询尴尬场面。

这看起来不就是变成2个微服务吗?

并不是的,微服务的划分是基于业务领域的,不同的领域才划分为不同的微服务。

但 CQRS 中的命令模型、查询模型,它们还是属于同一领域的,查询模型不能脱离命令模型,它们是紧耦合的。

所以 CQRS 并不是两个独立的微服务。

那么 CQRS 如何同步数据呢?

这是没有限定的,你可以使用同步更新。

image

也可以异步更新,例如使用 MQ。

image

这种方式用的比较多,因为它的可靠性、扩展性都很好,只是会有短暂的数据不一致。

CQRS 看起来很像缓存啊?

是有些类似,但查询模型并不是单纯的用来提升查询性能的数据镜像。

查询模型的本质是用于创建多样化的数据展现形式。每一种形式适用于某类用户的需求。

CQRS 的查询模型可以使用不同的技术实现,例如有些使用关系数据库,有些使用 Redis ……

CQRS 把数据变更、查询分离之后,为查询带来了最大化的自由,同时呢,也大幅提升了这两方面的工作效率,相较于之前整合在一起,分开后负载压力肯定会减轻。这也是 CQRS 带来的性能优势。

CQRS 有什么不足?

凡事都有两面性,很明显,CQRS带来了复杂性

之前一体的时候,只有一个数据模型,一套技术。

使用 CQRS 之后,至少就要有 2 个模型,使用的技术也会增加。

还要保持数据的同步,开发维护的任务自然更重了。

还有数据一致性的问题,如果使用同步方式,一致性强,但跨数据源的实时同步可不容易,写入性能必然下降,失败的概率也会增加。

如果使用异步方式,那就要考虑数据延迟问题,在需要立即看到变化结果的场景就不能使用了。

小结一下,CQRS 把数据的变更和查询拆开了,有各自的数据模型。

命令模型负责数据的变更,并把最新数据同步给命令模型。

命令模型根据自己的想法来安排数据,想怎么用就怎么用。

好处是可以让查询更加自由,更快的满足多变的业务需求。

坏处是增加了架构的复杂度,还有数据同步带来的问题。

我们可以根据自己的实际情况来抉择。

推荐阅读

OAuth2 图解

轻松理解 Kubernetes 的核心概念

开发者必须要了解的架构技术趋势:Service Mesh

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容