设为首页 | 加入收藏 | OA登陆 | 返回旧网站
中文版 | ENGLISH

NEWS

Apple

(022)84236606
当前位置:主页 > Apple >
DDD CQRS架构和传统架构的优弱点较量
发布时间:2017-07-10 09:00 来源:http://www.techolics.com

DDD CQRS架构和传统架构的优弱点较量

最近几年,在DDD的规模,我们常常会看到CQRS架构的观念。我小我私人也写了一个ENode框架,专门用来实现这个架构。CQRS架构自己的头脑着实很是简朴,就是读写疏散。是一个很好领略的头脑。就像我们用MySQL数据库的主备,数据写到主,然后查询从备来查,主备数据的同步由MySQL数据库本身认真,这是一种数据库层面的读写疏散。关于CQRS架构的先容着实已经很是多了,各人可以自行百度或google。我本日首要想总结一下这个架构相对付传统架构(三层架构、DDD经典四层架构)在数据同等性、扩展性、可用性、伸缩性、机能这几个方面的异同,但愿可以总结出一些利益和弱点,为各人在做架构选型时提供参考。

媒介

CQRS架构因为自己只是一个读写疏散的头脑,实现方法多种多样。好比数据存储不疏散,仅仅只是代码层面读写疏散,也是CQRS的浮现;然后数据存储的读写疏散,C端认真数据存储,Q端认真数据查询,Q端的数据通过C端发生的Event来同步,这种也是CQRS架构的一种实现。本日我接头的CQRS架构就是指这种实现。其它很重要的一点,C端我们还会引入Event Sourcing+In Memory这两种架构想想,我以为这两种头脑和CQRS架构可以美满的团结,施展CQRS这个架构的最大代价。

数据同等性

传统架构,数据一样平常是强同等性的,我们凡是会行使数据库事宜担保一次操纵的全部数据修改都在一个数据库事宜里,从而担保了数据的强同等性。在漫衍式的场景,我们也同样但愿数据的强同等性,就是行使漫衍式事宜。可是众所周知,漫衍式事宜的难度、本钱长短常高的,并且回收漫衍式事宜的体系的吞吐量城市较量低,体系的可用性也会较量低。以是,许多时辰,我们也会放弃数据的强同等性,而回收最终同等性;从CAP定理的角度来说,就是放弃同等性,选择可用性。

CQRS架构,则完全秉持最终同等性的理念。这种架构基于一个很重要的假设,就是用户看到的数据老是旧的。对付一个多用户操纵的体系,这种征象很广泛。好比秒杀的场景,当你下单前,大概界面上你看到的商品数目是有的,可是当你下单的时辰,体系提醒商品卖完了。着实我们只要细心想想,也确实云云。由于我们在界面上看到的数据是从数据库取出来的,一旦表现到界面上,就不会变了。可是很也许其他人已经修改了数据库中的数据。这种征象在大部门体系中,尤其是高并发的WEB体系,尤其常见。

以是,基于这样的假设,我们知道,即便我们的体系做到了数据的强同等性,用户照旧很也许会看到旧的数据。以是,这就给我们计划架构提供了一个新的思绪。我们可否这样做:我们只必要确保体系的统统添加、删除、修改操纵所基于的数据是最新的,而查询的数据不必是最新的。这样就很天然的引出了CQRS架构了。C端数据保持最新、做到数据强同等;Q端数据不必最新,通过C端的变乱异步更新即可。以是,基于这个思绪,我们开始思索,怎样详细的去实现CQ两头。看到这里,大概你尚有一个疑问,就是为何C端的数据是必必要最新的?这个着实很轻易领略,由于你要修改数据,那你也许会有一些修改的营业法则判定,假如你基于的数据不是最新的,那意味着判定就失去意义可能说禁绝确,以是基于老的数据所做的修改是没故意义的。

扩展性

传统架构,各个组件之间是强依靠,都是工具之间直接要领挪用;而CQRS架构,则是变乱驱动的头脑;从微观的聚合根层面,传统架构是应用层通过进程式的代码和谐多个聚合根一次性以事宜的方法完成整个营业操纵。而CQRS架构,则是以Saga的头脑,通过变乱驱动的方法,最终实现多个聚合根的交互。其它,CQRS架构的CQ两头也是通过变乱的方法异步举办数据同步,也是变乱驱动的一种浮现。上升到架构层面,那前者就是SOA的头脑,后者是EDA的头脑。SOA是一个处事挪用另一个处事完成处事之间的交互,处事之间紧耦合;EDA是一个组件订阅另一个组件的变乱动静,按照变乱信息更新组件本身的状态,以是EDA架构,每个组件都不会依靠其他的组件;组件之间仅仅通过topic发生关联,耦合性很是低。

上面说了两种架构的耦合性,显而易见,耦合性低的架构,扩展性肯定好。由于SOA的思绪,当我要加一个新成果时,必要修改原本的代码;好比原本A处事挪用了B,C两个处事,其后我们想多挪用一个处事D,则必要改A处事的逻辑;而EDA架构,我们不必要动现有的代码,原本有B,C两订阅者订阅A发生的动静,此刻只必要增进一个新的动静订阅者D即可。

从CQRS的角度来说,也有一个很是明明的例子,就是Q端的扩展性。假设我们原本Q端只是行使数据库实现的,可是其后体系的会见量增大,数据库的更新太慢可能满意不了高并发的查询了,以是我们但愿增进缓存来应对高并发的查询。那对CQRS架构来说很轻易,我们只必要增进一个新的变乱订阅者,用来更新缓存即可。应该说,我们可以随时利便的增进Q端的数据存储范例。数据库、缓存、搜刮引擎、NoSQL、日记,等等。我们可以按照本身的营业场景,选择吻合的Q端数据存储,实现快速查询的目标。这统统都归功于我们C端记录了全部模子变革的变乱,当我们要增进一种新的View存储时,可以按照这些变乱获得View存储的最新状态。这种扩展性在传统架构下是很难做到的。

可用性

可用性,无论是传统架构照旧CQRS架构,都可以做到高可用,只要我们做到让我们的体系中每个节点都无单点即可。可是,对比之下,我认为CQRS架构在可用性方面,我们可以有更多的回避余地和选择空间。

传统架构,由于读写没有疏散,以是可用性要把读写合在一路综合思量,难度会较量更大。由于传统架构,假如一个体系的岑岭期的并发写入很大,好比为2W,并发读取也很大,好比为10W。那该体系必需优化到能同时支持这种高并发的写入和查询,不然体系就会在岑岭时挂掉。这个就是基于同法式用思绪的体系的弱点,没有一个对象去削峰填谷,生涯刹时多出来的哀求,而必需让体系不管碰着几多哀求,都必需能实时处理赏罚完,不然就会造成雪崩效应,造成体系瘫痪。可是一个体系,不会一向处在岑岭,岑岭也许只有半小时或1小时;但为了确保岑岭时体系不挂掉,我们必需行使足够的硬件去支撑这个岑岭。而大部门时辰,都不必要这么高的硬件资源,以是会造成资源的挥霍。以是,我们说基于同法式用、SOA头脑的体系的实现本钱长短常昂贵的。