任何人类的设计都会腐化,软件系统也不例外数据库
腐化之谜编程
随着系统的规模增加和复杂度膨胀,系统会慢慢腐化。架构
因而改一个很简单的下单地址,就会牵动整个交易系统十几处的改动。框架
如何解决这种腐化之谜呢?微服务
参考计算机系统架构:测试
一个复杂的计算机系统架构包括:软件系统元素,元素之间的联系,元素自己有本身特有属性。架构设计
因而咱们能够在架构角度参考计算机系统架构的实现。设计
为达到上面提到的架构建模的目的,引入领域驱动。3d
领域驱动围绕业务概念构建领域模型,经过分离技术的方式实现应对复杂业务,及系统难以演进问题的解决方案。日志
DDD带来的不一样:
基于问题空间的DDD模式
基于解空间的DDD模式
由显示边界限定的特定内聚职责,领域模型便存在于上下文以内。
界限上下文识别过程:
如何经过真实业务驱动需求演化出DDD模型呢?
能够采用事件风暴进行领域分析。
流程:
事件风暴 事件:PM关心真实事件 如:用户订单已发布,商品已发布 说明:关注点在于什么领域模型发生了什么变化。
命令风暴 命令:经过什么活动产生了事件 如:用户提交了订单,开放平台同步商品 说明:命令帮助咱们明确系统对外提供的能力,同时明确业务上的输入 命令来源:用户UI界面的操做,外部系统调用触发,定时任务触发
寻找聚合 聚合:一组相关性领域模型的聚合,用来封装业务不变性,确保关联紧密的领域模型内聚在一块儿 如:订单和商品 聚合的目的在于业务内聚,强迫RD进行简化领域模型的关联,实现业务设计高内聚低耦合的目的
划分界限上下文
界限上下文以内能够自由选择架构模式,如MVC,CQRS,微服务,SOA等。
不是全部界限上下文都采用领域驱动方式,非核心子域可参考数据驱动下的面向过程编程。
提取出面向切面的聚合层,以工程技术因素为主要考虑点。
DDD的核心价值在于指导划分界限上下文。
领域模型建设思路:
参考六边形架构:
架构目标:
架构原则:
CQRS:命令查询职责分离
将更复杂的领域模型拆分为读取和写入两部分。 将消息传递,数据日志同步,领域事件和事件溯源使用到特定上下文。
目前咱们活动营销系统中,存在大量迭代需求都是针对运营需求所设计,需求自己具备复杂性和持续迭代性,故均已转换采用领域驱动设计方式实现。
对现有及可预期的玩法需求进行了逻辑抽象,提供了统一业务领域玩法模型,为运营提供统一玩法配置管理平台,进行玩法需求配置,通过领域系统内核进行集成,对用户输出统一玩法活动UI及流程。
在局部演进及扩展需求,采用元数据+大字段应对信息的不肯定性,流程引擎+规则引擎构造玩法,DSL提供动态建立玩法资源配置的能力。
梳理事件风暴,抽象命令风暴,寻找履行命令的业务名词,对相似的名词玩法进行共性提取,作合适的抽象,同时创建通用语言描述及定义。
采用DDD分层架构+六边形架构+CQRS模型,使得系统具有面向领域驱动的演进能力。
DDD不是银弹
哪些产品适用于DDD:
领域模型好坏的标准: