写点什么

白话中台番外篇:DDD、EventStorming 与业务中台(二)

2020 年 1 月 15 日

白话中台番外篇:DDD、EventStorming与业务中台(二)

DDD 虽然诞生的早,但直到现在,和我们日常工作的距离也并不远,例如我们代码中经常出现的 XxxEntity,XxxRepository ,XxxService,XxxFactory……这些类,这里的 Entity、Repository、Service 和 Factory,以及我们现在大家早已习以为常的分层架构,都是出自 DDD 之手,只不过很多人已经不知道这些都是拜 DDD 所赐而已。


我们中的大多数人就像“猴子定律”里后来的猴子们一样,习惯了约定俗成,日复一日重复着(Controller-Service-Repository-Entity => CRUD)这些看似枯燥的操作,而早已忘了为什么一开始架构和这些所谓的最佳实践被设计成这个样子,少了一份溯本求源的精神。


以致于我经常在面试的时候,问候选人,你这里为什么要一个 Service 呀?大多数的回复都是:这是规范呀!这不是基本常识么?我们公司规定都得这么写的……


那说来说去,DDD 到底是什么呢?


在我看来,DDD 其实就是面向对象的一套“方言”,提供了一种基于业务领域的对象划分和分类方法,其最大的价值就在于对于软件开发过程全生命周期使用语言的统一!


怎么讲呢?


在面向对象的世界,只告诉了我们万事万物皆是对象。但并没有告诉我们对象究竟应该怎么组织,该以什么角度进行划分。


而作为技术人员的我们,早已习惯了从技术的角度出发思考,自然就出现了“用技术的语言”定义对象的习惯,例如最常见的 DAO(Data Access Objects),DTO(Data Transfer Object)这类对象的划分方式就是使用技术视角看待和分类对象的典型案例。


这样从技术视角分类对象的问题,就在于在软件的开发过程中,会涉及到多“语言”间的对应和翻译,例如最常见的就是业务语言和技术语言的相互翻译。想想周围经常出现的研发和产品之间各种痛苦的沟(吵)通(架)场景,应该就知道我说的意思了。


这个过程其实和两种不同语言(例如中文和英文)的人之间的沟通是一样的,而且更加隐蔽,因为说的明明都是中文,但是彼此就是听不懂彼此说的到底是什么意思,而且都觉得对方像个傻子,听不懂人话,殊不知其实两个人说的本身就不是同一种语言。


而 DDD 的出现,就是为了解决这个问题。它通过一套面向对象的分类方法或是方言体系,从领域出发,实现软件开发过程中各个角色和环境的“统一语言”(UBIQUITOUS LANGUAGE)。例如使用“仓库(Repository)”替代“数据访问对象(DAO)”,就更能让业务和技术同时理解这个对象的作用。


就像车同轨,书同文一样。


好了,了解了 DDD 的来历和价值,那你肯定还有疑问,既然 DDD 这个概念已经快被人们淡忘了 10 多年了(虽然我们一直还在不知不觉中僵硬地应用着),那为什么最近一两年又突然重出江湖,重新被大家关注了呢?


答案其实就两个:微服务和中台。


说到这里还有个段子:


其实 DDD 一开始的时候,就把领域分析设计分为了战略(Domain、Bounded Context)和战术(Entity、VO、Repository、Service……)两个部分。按道理应该从战略入手,再下沉到战术部分。但是 Eric Evans 在写《Domain-Driven Design》这本书时,可能是基于当时的环境,却是先写的战术部分,书的后半部分才开始展开 DDD 的战略部分。


而又因为战术部分本身就很复杂很枯燥(各种图各种代码),所以很多人并没有坚持到读后边的战略部分,就读不下去(比如我)。导致的结果就是这么多年战术部分被大家充分的讨论和应用,而战略部分的影响则相较之下非常有限,讨论和应用的也不多。



直到微服务的横空出世……


随着微服务架构的兴起,微服务到底如何拆分就成了人们最最关注的问题。这时候一些“老人儿”们突然想起来,这不是正是应用 DDD 中战略部分(问题域,限界上下文)应用和施展拳脚的场合么?!


所以随着微服务的爆炸式发展,DDD 这位退隐已久的老江湖,又再次被请出了山,站到了大家的面前。


而此时,他身边还多了一个年轻的新搭档,他正是:事件风暴。


EventStorming(事件风暴)

现在,当很多人谈到 DDD 都会同时谈到 EventStorming,甚至有人误认为这两个名词本身指代的就是同一个概念。


但其实这是两个完全独立的工具。


DDD 是一套基于领域的分析和建模方法,而 EventStorming 则是一套 Workshop(可以理解成一个类似于头脑风暴的工作坊)方法。DDD 出现要比 EventStorming 早了 10 多年,而 EventStorming 的设计虽然参考了 DDD 的部分内容,但是并不是只为了 DDD 而设计的,是一套独立的通过协作基于事件还原系统全貌,从而快速分析复杂业务领域,完成领域建模的方法。



EventStorming 最初由 Alberto Brandolini(曾受邀参加了 DDD-China 2017)开发,经过 DDD 社区和 ThoughtWorks 的很多团队实践验证后,于 2015 年 11 月进入 ThoughtWorks 技术雷达,开始被更多人知晓和应用,从此成为 DDD 的最佳拍档。



关于 EventStorming 的具体内容和细节,已经有很多文章都介绍了,不过还是强烈建议先看一下 eventstorming.com 官网的那本作者 Alberto Brandolini 自己写的《Introducing EventStorming》,应该是最官方最正宗的对于 EventStorming 的介绍。


而书中的下面这个图,我认为是对于 EventStorming 最清晰、完整且简单的概括。完整的阐释了从系统外部与用户的交互,到系统内(事件-策略-命令-聚合-事件)的事件传递涟漪,以及通过事件影响到读模型从而给予用户动作的响应,从而形成完整闭环的全过程。对我们了解还原系统的全貌非常有帮助。



前面提到了,EventStorming 和 DDD 两个独立的工具,形式不同、解决的也是不同的问题,那为什么这两者总是搭档出现呢?


关键就在于下图这条红线,就像是月老手中的红线一样,将两个概念牵在了一起。


DDD 提供了一套面向对象的“方言”,给出了一套面向对象的分类框架和架构指引,但是在 DDD 中并没有明确给出如何为一个系统识别出这些不同种类的对象的过程和方法。


而 EventStorming 的出现正好弥补了这个空白,通过 EventStorming 工作坊的方式,正好给我们提供了一个还原和分析系统的方法,并最终通过“聚合”这条红线,穿越时空,无缝切入到 DDD 的领域范畴之内,以“聚合”为支点,向上可以进一步做问题域和限界上下文的战略分析,向下则可以通过聚合的进一步展开进行实体、值对象等相关的战术分析,引导落地。


而 DDD 战略设计中问题域和限界上下文的识别,则为我们划分微服务提供了非常强有力的支撑,至此我们就通过 EventStorming 和 DDD 的这一对强力组合的联袂辅助下,找到了解决了微服务架构下最困难问题之一的,既服务该如何划分问题的解题思路和落地方法。


那说了半天微服务,DDD 和 EventStorming 到底又与业务中台有什么关系呢?



本文转载自健荐公众号。


原文链接:https://mp.weixin.qq.com/s/H_KiY9sxTMAN4xrYwZOqRg


2020 年 1 月 15 日 17:55308

评论

发布
暂无评论
发现更多内容

如何将FastDFS存储数据平滑迁移至XSKY对象存储?

XSKY融合存储

1.1 了解Spring框架 -《SSM深入解析与项目实战》

谙忆

有它的加持,单机玩转百亿大数据不是梦!

易观大数据

InnoDB存储引擎简介

Simon

MySQL innodb

设计模式之——单例模式你真的会吗?

诸葛小猿

设计模式 单例模式 Singleton 饿汉式 懒汉式

1.2 了解MyBatis -《SSM深入解析与项目实战》

谙忆

设计模式之假如需要一百万个对象

架构师修行之路

LeetCode题解:24. 两两交换链表中的节点,迭代,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

ChaosBlade:从零开始的混沌工程(五)

郭旭东

Kubernetes 云原生 混沌工程

如何设计一个优秀的组件

Lee Chen

前端进阶训练营

联盟链有自己的路要走

Leonbond

区块链 联盟链 公有链

《SSM深入解析与项目实战》目录与说明

谙忆

2.1 类加载器、 双亲委派模型 -《SSM深入解析与项目实战》

谙忆

七的婚姻生活

徐说科技

SQL的三十而已—SQL30问

大唐小生

sql 技术人生

直播平台在贝壳找房中的实践与运用

陈威威

架构 分层架构 直播 分层思维 多元场景应用

零基础建网站必备技能,看这一篇就够了

北柯

程序语言 网站搭建 编程网站

【译】代码中如何写出更有意义的命名

Jackey

代码质量

数据处理能力相差 2.4 倍?Flink 使用 RocksDB 和 Gemini 的性能对比实验

Apache Flink

flink

微服务架构下你的数据一致了吗?

码猿外

架构 微服务 数据一致性

C/C++陷阱与套路,当年就是折在这些地儿…

华为云开发者社区

c++ 设计 编辑 程序 陷阱

Jessie’s产品经理系列1-基础能力篇

架构5班杨娟Jessie

产品经理 能力模型

计算机网络基础(十五)---传输层-TCP协议详解

书旅

计算机网络 网络 协议栈 协议族

JVM系列之:再谈java中的safepoint

程序那些事

Java JVM JIT safepoint

操作系统和并发的爱恨纠葛

cxuan

Java 并发

CDN百科10:快速上手阿里云DCDN全站加速,最新配置与购买优惠教程

阿里云Edge Plus

CDN 直播 网页加速

视频会议专线部署不会?别急,我教你

华为云开发者社区

网络 网关 华为云 高清视频 welink

信创舆情一线--工信部开展网络安全技术应用试点示范工作

统小信uos

设计模式中的单例模式并不完美

架构师修行之路

设计模式 单例模式 23种设计模式 高并发系统设计

Google Protocol Buffer 学习笔记

半亩房顶

protobuf

秒懂云通信:如何使用阿里云号码认证服务(小白指南)

阿里云Edge Plus

云通信 通信云 号码认证

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

白话中台番外篇:DDD、EventStorming与业务中台(二)-InfoQ