Udi Dahan曾在2017年阿姆斯特丹的DDD欧洲年会上发表过一篇演讲——if (domain logic) then CQRS, or Saga。视频是UP主从Youtube搬运的,我听力水平通常,因此如下内容有所偏颇的话,还请见谅。git
在演讲中,他提到了Sandbox、Private Domain、Public Domain和Collaboration Domain等一些概念,为更好地应用DDD开辟了不一样视角。如下即是个人思考与收获。github
Udi用级联删除的例子,引出了沙盒Sandbox。错误的级联删除操做,特别是在数据库中Table级别上的删除操做,对任何一个系统而言均可谓灭顶之灾。因此瓜熟蒂落的,咱们会使用给数据行打上某种删除标志的方法,称之为“软删除”,避免数据被完全删除。这就象操做系统里的回收站同样,给了咱们一次反悔的机会。若是在全部的软件系统里都有这样一个安全沙盒,是否是就彻底解决了删除问题?数据库
随后,Udi用博客做为例子,引出了Private Domain和Public Domain的概念,并阐述了Sandbox与两者之间的联系。一篇随笔被正式发布前,博主能够在编辑页面随便折腾。而在随笔正式发布后,全部的修改和删除操做就须要慎重了。此处,发布前的随笔处于Private Domain,发布后则进入了Public Domain。对处于Private Domain范围内的私有数据,咱们能够随意地增删查改,而不用顾忌任何的业务规则和约束。而当私有数据被推送到Public Domain时,则必须顺利经过各类规则的审核与验证,进而成为构成系统的固定组成部分。其中,每一个Private Domian对应一个Sandbox,用户能够随心所欲,而没必要担忧对系统形成实质影响。安全
Udi接着商品被删除的例子,延伸到购物车中已加入的商品售罄或被停售的状况,提出Collaboration Domain的概念。在竞态条件(即并发条件下的竞争条件)下,即代表有多个参与者须要对同一个数据进行操做,此时属处的领域即Collaboration Domain。这样的协做领域,一般能够围绕if语句进行发掘。有if判断涉及其余的实体,则一般代表该数据也可能会被其余参与者改变。此时,CQRS成为很天然的选择。由于命令执行的环境是通过事先检验的,因此命令老是能成功执行。在这样的设定下,把一个用户下单的操做分割为多个步骤,在放入购物车和提交订单时分别进行一次商品有效性的检验。并发
为了减小检验的次数,Udi借Shopping Cart Timeout的例子引出了Collaboration Timeout的概念。给购物车一个活动状态的超时设定:用户放入商品时,购物车进入激活状态,跨入协做领域,此时因商品在售,订单能够成功提交;用户未在超时前提交订单的,购物车进入失活状态,退出协做领域,以后商品将因售罄或停售而没法再加入购物车。框架
因为Collaboration Domain和CQRS的存在,Udi指出,必须改变传统的思考方式,由于Saga将更广泛地出如今模型之中。对此不能有退缩和犹豫,应当与领域专家深刻交流,使本身也成为业务专家,确保每一个流程都彻底可控。最后,Udi提出消息中间件是实现Saga的重要工具,因而顺手推介了一下本身维护的NServiceBus框架。dom