《实现领域驱动设计》拆书稿 第8章 领域事件

image.png

拆书稿

一、领域事件是什么?

定义:
领域专家所关心的(需要跟踪的、希望被通知的、会引起其他模型对象改变状态的)发生在领域中的一些事件。领域事件是用来捕获领域中发生的具有业务价值的一些事情。

二、怎么辨别出领域事件?

注意专家说的关键词汇:

  • “当......”
  • “如果发生......”
  • “当.......的时候,请通知我”
  • “发生.......时”

三、领域事件应该具备的属性?

一些概念

事件源事件流

一些属性

名字、发生时间、身份标识

四、领域事件的一些概念和我们平时理解基于中间件事件的区别

发布-订阅模式
是一个泛的概念

五、向远程限界上下文发布领域事件

1、消息设施的一致性

  • 领域模型和消息设施共享持久化存储
  • 领域模型的持久化存储和消息持久化存储由全局的XA事务(两阶段提交)所控制
    在领域模型的持久化存储中,创建一个特殊的存储区域(比如一张数据库表),该区域- 用于存储领域事件;

2、自治服务和系统

自治性
可以通过异步的消息来达到更高层次的独立性

3、容许时延
我们必须得知道业务方多长的时间延迟是可以接受的

六、事件存储能给我们带来什么好处?

  • 将事件存储作为一个消息队列来使用,该消息队列的作用是将所有的领域事件通过消息设施发布出去。
  • 将相同的事件存储用于基于REST的事件通知
  • 检查由模型的命令方法所产生的所有结果的历史记录;跟踪bug
  • 使用事件存储中的数据来进行业务预测和分析;
  • 当从资源库中获取一个聚合实例时,使用事件来重建该聚合实例;
  • 撤销对聚合的操作;

七、转发存储事件的架构风格

1、基于REST资源的方式

主要是"拉"的方式

基于REST的事件通知,可以参考基于Atom的通知日志的优缺点讨论
Jim Webber的演讲【Webber, REST & DDD】

2、基于消息中间件的方式
主要是"推"的方式

读后思考

我们从一个更高的层次来认识事件,之前我们在系统开发中一提到事件马上会想到的是消息中间件。本章就从领域的高度来重新带你认识事件。这时你会从平时的深井中跳出来,原来消息中间件只是实现事件转发的一种方式而已。在系统的设计中我们可以在更抽象更顶层的角度来设计事件的产生、存储、转发,从而使业务流的设计更加清晰合理。

1、引入领域事件的目的?

  1. 解耦
  2. 使用领域事件进行事务的拆分,通过引入事件存储,来实现数据的最终一致性。

2、领域事件有哪些行为?

领域事件 = 事件发布 + 事件存储 + 事件分发 + 事件处理

3、如何命名领域事件?

事件代表的是一个已经发生的事实(fact),所以往往用动词的过去时态来表达,一般是“产生事件的对象名称+完成的动作的过去式”的形式,例如:订单已发货(OrderDispatchedEvent)、订单已收货和订单已确认(OrderConfirmedEvent)等事件。

4、如何找出领域事件?

首先要明白:同一个实体在不同的问题域下领域事件是不同的。
比如:问诊业务,医生的场景下关注的是:病情已确诊,处方已开具;患者的场景下关注的是:医生已接诊,病情已确认,药品已收到;

下面都可以是领域事件:

  • 业务流程中的一个步骤:问诊结束- 定时发生的事情:医生结薪每晚对账完成;
  • 一个事件发生后引发的后续动作:随访对话结束后24小时自动关闭;
业务的因果关系

一系列"关键事件"连接起来,会形成明显的基于一条时间线的状态迁移过程,这种状态迁移过程体现了业务的因果关系。导致事件发生的因,在事件风暴中被称之为命令(Command),相当于事件的发布者。命令往往由动宾短语组成,例如Place Order、Send Invitation等。

事件由命令触发,命令由参与者(Actor)发起

参与者的引入就将对事件的分析与业务场景结合起来,这就驱动着参与事件风暴的所有成员要对业务达成一致(形成统一语言),并从用户体验(User Experience)的角度去分析每个业务场景。这时作为参与者对业务的参与,就不再是发起一个业务流程,执行一个业务动作,而是做出决策(Decision)。

在事件风暴中,决策就是命令,但“决策”更具有拟人化的意义,正如在现实生活中,当我们做出决策时,需要如下两方面数据的支撑:

  • 信息:必须基于足够充分的信息才能做出正确的决策,提供这些信息的对象就称之为读模型(Read Model)
  • 策略:一旦做出决策就会触发一个业务流程,流程的执行暗含了业务规则,该规则被命名为策略(Policy)

5、事件风暴

事件风暴是一种快速探索复杂业务领域和对领域建模的实践,它建立了以"领域事件"为核心的建模思路。

事件风暴过程:

  1. 寻找领域事件
  2. 寻找命令和角色
  3. 寻找领域模型和聚合
  4. 划分子域和限界上下文

推荐阅读

https://www.cnblogs.com/sheng-jie/p/7124727.html
https://juejin.im/post/5dde595a5188256ea364efbf
http://zhangyi.xyz/event-storming-distill/

你可能感兴趣的:(《实现领域驱动设计》拆书稿 第8章 领域事件)