BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

对CQRS的一次批判性思考

| 作者 Jan Stenberg 关注 34 他的粉丝 ,译者 邵思华 关注 3 他的粉丝 发布于 2015年7月24日. 估计阅读时间: 4 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

在今年的NDC大会上,Udi Dahan进行了一场有关CQRS的演讲。他在演讲中提到,如果从更广义的架构角度来看,除了命令与查询职责分离(CQRS)之外,还有其它类似的架构风格可以选择,例如事件驱动架构(EDA)与发布-订阅架构。而在某些场景中,使用传统的数据库技术也能够解决同样的问题,并且要简便的多。Udi Dahan的想法是应当多考虑一些应用CQRS的不同方式。而在确实需要CQRS架构的场合,他认为也存在着一种可替代的方式能够实现CQRS的大部分目标,同时与传统的CQRS相比其可变部分更少。

Dahan与Greg Young都可称得上是位于CQRS架构最前沿的专家,在他与客户进行交流的过程中,他总是察觉到一点,即可伸缩性是应用CQRS架构的主要理由之一。在进行大量的读操作时,如果将读取与写入操作进行分离,将能够提高查询的可伸缩能力。但Dahan也提示道,现在已经可以通过某些技术实现读写分离,并且只需极小的代码改动,甚至是零改动,他认为开发者们应当注意到这种技术的存在。另一方面,Dahan认为,由于应用CQRS这一主题已经在全球范围内进行了多次演讲,在社区中无意中形成了一种“必须”使用CQRS的压力,这也是人们应用CQRS架构的原因之一。

其实对于读取密集型应用环境来说,可以通过另一种途径实现可伸缩性,即主/从复制。数据的修改全部发生在主节点上,数据将同步到一个或多个进行读取的从节点上。这种方式已经存在很久了,并且在许多数据库机制中都已经得到了完整的支持。但Dahan也将它定义为一种CQRS架构,因为它确实做到了读写分离。他也提到,如果在生成查询结果时需要进行复杂的连接操作,那么这种数据复制机制无法解决由此引起的延迟问题,但至少这种机制能够通过加入更多的从节点克服数据吞吐量方面的问题。

Dahan还推荐了一种用于处理可伸缩性问题的解决方案,即数据分片、或数据库分区。这种方式将某张表中的数据切分到数据库的多个实例中,并通过某个字段在实例之间进行分布,例如客户的名称。这种方式的一大优点在于能够设置多个主节点,因此可以对命令与查询两方面同时进行扩展。而许多数据库技术本身就支持分区能力,只需一些非常简单的代码就可以实现。Dahan同时提到,在使用多个主节点的情况下无法支持跨记录的事务,因此就像对解决方案领域所进行的分区一样,对业务领域也要进行某种程度的划分。

Dahan认为在某一种场景下是非常适合应用CQRS架构的,即具有高竞争性的业务领域。在这种领域中的负载非常大,而且具有高度的局域性。一旦出现并发异常就可能导致大多数事务操作开始失败、无法释放数据库连接、阻塞用户请求等一系列问题,产生巨大的系统瓶颈。这种测试用例在进行性能测试时经常会被忽略,一般在进行可伸缩性测试时,通常会针对多条记录创建大量的用户请求,而不是让所有的请求都集中于少数几条记录上。即使完美地实现了CQRS架构,这种瓶颈依然会出现在数据查询的场景,由于后台的进程不能快速地完成更新操作,导致查询模型总是无法及时获得最新的数据。

对于这种高竞争性的问题,Dahan的解决方案是转为使用一种基于事件的模型,其数据模型是非阻塞式的、并且是只增的(append only),这就意味着该模型不会受到竞争性的影响。但这种方案可能会带来一个问题,因为它影响了某些业务规则。打个比方,某条业务规则规定只有在订单中的产品都有足够的库存时才允许接受订单。而这种方案则要求在业务处理上提供更高的灵活性,甚至可能会对需求产生变更。拿这个订单的例子来说,业务流程应当允许在不检查库存的情况下直接接受这个订单。而如果在处理订单时发现其中有某些产品库存不足,需要由业务人员决定如何处理这种情况。

查看英文原文:A Critical Look at CQRS

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

淘宝模式 by 杨 雷

一看完最后一句,就意识到会技术决定业务有争议,返过去看了原文以及评论,果真如此。
另外一个立即意识到的,就是无库存下订单,立马联系到双11的退单运动,再看原文评论,呵呵,果真也是如此。www.infoq.com/news/2012/12/interview-taobao-tmall/
有意思,颇具嘲讽。

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

1 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT