关于DDD(领域设计)的那些事: (事件风暴,领域事件,属性,规则,业务聚合等)

-- 关于DDD(领域设计)的一些总结: (事件风暴,领域事件,Actor,属性,规则,业务聚合等)
【官网】:

应用场景

在一个超复杂的业务场景中怎样实现跨职能跨团队快速分析? 当我们需要跨职能促进技术,用于揭示系统或业务流程的有界上下文,微服务,垂直切片,故障点和起点时,我们往往需要用到领域事件驱动的设计。 其中比较主流的方法论是事件风暴,它可以帮助我们提取领域事件,规则,命令,业务边界,业务聚合等

基础资源

使用须知

需要根据具体的业务场景和实际流程,并且尽可能的在前期让相关的人员参与进来(业务员,业务分析师,研发人员,测试工程师,UI/UX设计,项目管理人员等)

配置步骤

A)术语.

>领域事件(DomainEvent).

<定义>

领域专家所关心的在领域中的一些事件.

<DDD意义>

Eric Evans在《领域驱动设计》中建议开发一个共享域模型,作为领域专家和IT之间的桥梁,它以无处不在的语言编写并由应用程序代码实现.

<核心思想>

1.软件项目的主要聚焦点应该在领域和领域逻辑,不应该直接从需求开始设计数据库表结构。

2.复杂的领域设计应该基于领域模型,领域模型是封装了数据和行为的对象。

3.软件工程核心实质是社会工程,优秀团队的竞争力来源于互相的信任及良好的沟通。DDD强调技术专家和领域专家一起进行创造性的合作,从而可以不断地切入问题域的核心。

<主要阶段>

以一种领域专家、设计人员、开发人员都能理解的通用语言作为相互交流的工具,在交流的过程中发现领域概念,然后将这些概念设计成一个领域模型;

由领域模型驱动软件设计,用代码来实现该领域模型。

<主要元素>

           发起方: (用户,定时器,第三方系统(System))

           命令:  例如(下单,支付)

           属性:  以下单的事件属性为例 (用户,店铺,商品,型号,价格,数量)

           事件:  例如 (订单已创建,订单已支付)  //订单已创建是有用户发起的,订单已支付是由第三方系统回调发起的)

           规则(Policy):   30分钟未支付自动取消订单.

            [注]事件风暴这一个实现DDD的方法论中,经常将发起方,命令,事件,规则作为4种基本元素.分别用一些不同颜色的贴纸来表示。

<常用架构>

领域事件可以是一种基于事件的架构。事件架构的好处是可以把处理的业务解耦,实现系统的可扩展性,提高主业务流程的内聚性.

<常用设计模式>

领域事件可以通过观察者模式和订阅模式进行实现。比较常见的实现就是事件总线.

>事件风暴(Event Storming).

<定义> 

Event Storming(事件风暴),它是一种轻量级的系统分析方法,基于 DDD 的概念,能够为我们梳理系统中的各种相关元素,其中包括了核心的 Aggregate.

<特征和应用场景>

跨职能促进技术,用于揭示系统或业务流程的有界上下文,微服务,垂直切片,故障点和起点.

>业务聚合(Aggregate).

 在很多的领域事件中,哪些领域驱动事件是内部可以形成闭环,且可以独立访问的. 那么这个东西就是一个业务聚合,也就是聚合根。

 例如在电商业务中:

        订单(已创建,已支付/已取消,已关闭)

        库存(已更新库存,已锁定,已扣减/已恢复)

        货物(  已派单,已发货,已签收)

       ....

>观察者模式与发布/订阅者模式.


常见问题

快速入门

1)通过事件风暴来实践DDD领域设计.

  • 参加人员: 条件许可的情况下应该全员参与,包括系统开发人员,业务分析师,业务人员,测试工程师,UX 设计师,项目管理人员等。
  • 场地要求: 场地尽可能的大,关键是要有一面长 4 米左右的墙壁,用来悬挂或是黏贴纸张。
  • 其他物料: 在进行事件风暴的过程中还需要准备以下的材料:
                      不同颜色的贴纸,或者贴纸相同但笔墨颜色不一样。用于区分:  实体,命令,事件,规则,属性等。


   

通过在便签上创建一系列域事件来描述业务流程。用于域事件的最常用颜色是橙色。DomainEvent是以过去时态表示的动词,表示域中的状态转换。在橙色便利贴上写下DomainEvent 的名称。

将粘滞便笺按从左到右的时间顺序放在建模表面上。在您进行风暴会议时,您会发现现有业务流程中存在问题。用紫色/红色的笔记清楚地标记这些。使用垂直空间表示并行处理。

发布所有事件后,专家将发布本地有序的事件序列并强制执行时间表。执行时间线会触发期待已久的对话,最终会出现结构STRUCTURE的设计概念 。 

这些事件块或常见分组为我们提供了我们的名义服务候选者(参与者或聚合体,取决于团队对DDD定义的严格程度)。这些将在Boris演习期间使用。

<预期产出1:找出命令>





<预期产出2:确定领域聚合>



找出领域名词

通过分析前一步产生的领域事件寻找领域名词,规则如下:

识别事件中有业务含义的名词;

将含有相同名词的事件合并;

确保名词代表的业务概念清晰完整且没有歧义;

用大黄色即时贴进行标记。


在确定领域聚合的时候,我们可以这样思考:它是否可以被独立访问,且可以形成闭合,如果可以被独立访问就是一个聚合,如果不能被独立访问就应该属于它依赖的聚合。




参考资料