拆书稿
一、领域事件是什么?
定义:
领域专家所关心的(需要跟踪的、希望被通知的、会引起其他模型对象改变状态的)发生在领域中的一些事件。领域事件是用来捕获领域中发生的具有业务价值的一些事情。
二、怎么辨别出领域事件?
注意专家说的关键词汇:
- “当......”
- “如果发生......”
- “当.......的时候,请通知我”
- “发生.......时”
三、领域事件应该具备的属性?
一些概念
事件源事件流
一些属性
名字、发生时间、身份标识
四、领域事件的一些概念和我们平时理解基于中间件事件的区别
发布-订阅模式
是一个泛的概念
五、向远程限界上下文发布领域事件
1、消息设施的一致性
- 领域模型和消息设施共享持久化存储
- 领域模型的持久化存储和消息持久化存储由全局的XA事务(两阶段提交)所控制
在领域模型的持久化存储中,创建一个特殊的存储区域(比如一张数据库表),该区域- 用于存储领域事件;
2、自治服务和系统
自治性
可以通过异步的消息来达到更高层次的独立性
3、容许时延
我们必须得知道业务方多长的时间延迟是可以接受的
六、事件存储能给我们带来什么好处?
- 将事件存储作为一个消息队列来使用,该消息队列的作用是将所有的领域事件通过消息设施发布出去。
- 将相同的事件存储用于基于REST的事件通知
- 检查由模型的命令方法所产生的所有结果的历史记录;跟踪bug
- 使用事件存储中的数据来进行业务预测和分析;
- 当从资源库中获取一个聚合实例时,使用事件来重建该聚合实例;
- 撤销对聚合的操作;
七、转发存储事件的架构风格
1、基于REST资源的方式
主要是"拉"的方式
基于REST的事件通知,可以参考基于Atom的通知日志的优缺点讨论
Jim Webber的演讲【Webber, REST & DDD】
2、基于消息中间件的方式
主要是"推"的方式
读后思考
我们从一个更高的层次来认识事件,之前我们在系统开发中一提到事件马上会想到的是消息中间件。本章就从领域的高度来重新带你认识事件。这时你会从平时的深井中跳出来,原来消息中间件只是实现事件转发的一种方式而已。在系统的设计中我们可以在更抽象更顶层的角度来设计事件的产生、存储、转发,从而使业务流的设计更加清晰合理。
1、引入领域事件的目的?
- 解耦
- 使用领域事件进行事务的拆分,通过引入事件存储,来实现数据的最终一致性。
2、领域事件有哪些行为?
领域事件 = 事件发布 + 事件存储 + 事件分发 + 事件处理
3、如何命名领域事件?
事件代表的是一个已经发生的事实(fact),所以往往用动词的过去时态来表达,一般是“产生事件的对象名称+完成的动作的过去式”的形式,例如:订单已发货(OrderDispatchedEvent)、订单已收货和订单已确认(OrderConfirmedEvent)等事件。
4、如何找出领域事件?
首先要明白:同一个实体在不同的问题域下领域事件是不同的。
比如:问诊业务,医生的场景下关注的是:病情已确诊,处方已开具;患者的场景下关注的是:医生已接诊,病情已确认,药品已收到;
下面都可以是领域事件:
- 业务流程中的一个步骤:问诊结束- 定时发生的事情:医生结薪每晚对账完成;
- 一个事件发生后引发的后续动作:随访对话结束后24小时自动关闭;
业务的因果关系
一系列"关键事件"连接起来,会形成明显的基于一条时间线的状态迁移过程,这种状态迁移过程体现了业务的因果关系。导致事件发生的因,在事件风暴中被称之为命令(Command),相当于事件的发布者。命令往往由动宾短语组成,例如Place Order、Send Invitation等。
事件由命令触发,命令由参与者(Actor)发起
参与者的引入就将对事件的分析与业务场景结合起来,这就驱动着参与事件风暴的所有成员要对业务达成一致(形成统一语言),并从用户体验(User Experience)的角度去分析每个业务场景。这时作为参与者对业务的参与,就不再是发起一个业务流程,执行一个业务动作,而是做出决策(Decision)。
在事件风暴中,决策就是命令,但“决策”更具有拟人化的意义,正如在现实生活中,当我们做出决策时,需要如下两方面数据的支撑:
- 信息:必须基于足够充分的信息才能做出正确的决策,提供这些信息的对象就称之为读模型(Read Model)
- 策略:一旦做出决策就会触发一个业务流程,流程的执行暗含了业务规则,该规则被命名为策略(Policy)
5、事件风暴
事件风暴是一种快速探索复杂业务领域和对领域建模的实践,它建立了以"领域事件"为核心的建模思路。
事件风暴过程:
- 寻找领域事件
- 寻找命令和角色
- 寻找领域模型和聚合
- 划分子域和限界上下文
推荐阅读
https://www.cnblogs.com/sheng-jie/p/7124727.html
https://juejin.im/post/5dde595a5188256ea364efbf
http://zhangyi.xyz/event-storming-distill/