CQRS与高性能

6CQRS(Command Query Responsibility Segregation)关键点


常见架构1(没有引入Saga)


常见架构2(引入了Saga)



读写分离: 将应用架构分为Command和Query两个部分

Command处理写请求

Query处理读请求

实践1

数据库共享,代码分离,强一致性

实践2

数据库分离,通过DomainEvent异步同步或者其他方式同步,Command采用EventSourcing避免并发锁

举个例子:秒杀并发改库存,最简单的方案,可以并发存储用户请求的Command,并发存储库存变更的Event,将并发修改的竞争资源"剩余数量"做内存实现,不存储,如果断电关机,保证Event足够,即可恢复"剩余数量"的最终状态

高性能的三个敌人

1 资源争夺

2 大量数据

3 网络开销


资源争夺实践方案

传统实践

如果共享资源是数据库行,由于数据库无法一下子支持海量并发,所以要保护数据库工作在最佳性能状态,在应用层排队,通过排队等待换或者排队批处理获得数据库的持续最优性能而不至于造成不可控的并发数争夺资源

基于ES,还有一个好处,直接存储Event,不存储聚合,架构上避免了并发更新聚合

在CQRS中的实践

1 一个Command修改一个聚合根,缩小事务的范围

如果业务上需要同时修改多个聚合根,通过事件驱动的思想实现业务流程(Saga)

2 同一个聚合根的修改操作类似秒杀场景,遵照传统实践方案排队控制共享资源并发数即可

Command和Event的幂等操作

Command是一个动作,结果是触发聚合发生变化

一般来说,我们对Command进行建模是有用的,比如用作审计,在这里,可以用来判重

对Command进行唯一编码,在数据库做主键,让数据库来保证唯一

Event是聚合发生改变后发出的Event

我们可以通过 聚合+Event序号 的方式,来唯一确定一个Event,通过数据库主键来判重,最后发送到可靠的消息中间件供其他服务消费

大量数据

Command

根据业务,水平,垂直拆分,时间拆分(水平?)

Event

在回溯时候用到,根据业务,按照Event类型,时间等维度拆分

Query

根据业务,做拆分

网络开销

一般来说,一个Command的处理过程中包括几个阶段

1 持久化Command

2 业务处理

3 其他服务的协作调用

4 生成并持久化Event

5 发布Command

基于消息驱动,纯异步,如果必要,将CommandStore和EventStore改为内存实现,让生命周期未结束的聚合一直驻留内存甚至不存储(因为可以从EventStore恢复状态)


参考资料:

http://www.cnblogs.com/netfocus/p/4055346.html

https://github.com/tangxuehua/enode

http://developer.51cto.com/art/201407/446106.htm

RocketMQ

问题:


1 服务挂掉,如果是纯内存实现,从Query服务中获取? 此时Query可能不够新,所以还是需要内存实现中有同步持久化逻辑?

应该选择用event来恢复状态

2 可否使用Event代替Command?

http://www.cuishilin.com/2015/12/69527.html

区别如上

3 事件的发出和事务持久化需要从时序上保证是事务的原子性,不能做一半?

4 数据中心的数据备份,按照时间异步处理?

5 Query服务中的数据是否保存历史?历史都从数据中心获取?

6 根据业务需要,核心系统有可能只处理当天数据,系统一天的业务结束后,归档数据到数据中心,第二天重新加载?

7 Query服务根据Event维护数据表的逻辑由团队中谁来做?代码放在对应Command服务里?

8 Query服务的连表查询由谁来做?他需要了解全部的表结构?(通过根据Event维护数据表这个过程来熟悉?)

9 是否可以考虑由每个Command的服务自己提供Query服务?

举例来说:查询某人的数据,账户相关数据在各个服务中都需要冗余?

10 Command服务拒绝提供任何Query接口?全都使用Query服务的?

11 Saga练习? https://mp.weixin.qq.com/s/HfLvNvbnE8DrM3n-DXgRQQ

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

推荐阅读更多精彩内容