学习什么是领域事件.什么时候并且为什么要使用领域事件。 •学习如何将领域事件建模成对象,何时应该为领域事件创建唯一的身份标识。 •学习一个轻量级的发布-订阅[Gamma et al]模式。 •学习哪些组件用于发布事件,哪些组件用于订阅事件。 •学习为什么我们需要一个事件存储.如何实现事件存储、如何使用事件存储。 •学习S aaSOvation团队是如何通过不同的方式将领域事件发布给自治系统
1 何时、为什么使用领域事件?
1.1 定义
使用领域事件来建模发生在领域中的一些事情。这是一个功能强大的建模工具,让人爱不释手。 使用领域事件时,首先就是要对不同事件进行定义。
《领域驱动设计》一书中并未给出领域事件的定义。因为该模型是在该书出版后才被提出。 当前对领域事件的定义:领域专家所关心的发生在领域中的一些事件。 将领域中所发生的活动建模成一系列的离散事件。每个事件都用领域对象来表 示……领域事件是领域模型的组成部分,表示领域中所发生的事情。[Evans, Ref, P-20] 一
个领域事件将导致进一步的业务操作,在实现业务解耦的同时,还有助于形成完整的业务闭环。
领域事件可以是业务流程的一个步骤,比如一个事件发生后触发的后续动作,比如密码连续输错三次,触发锁定账户的动作。
1.2 识别领域事件
-
“如果发生……,则……”
-
“当做完……的时候,请通知……”(这里的通知本身并不能构成一个事件,而只是表明我们需要向外界发出通知)
在这些场景中,如果发生某种事件后,会触发进一步的操作,那么这个事件很可能就是领域事件。由于领域事件需要发布到外部系统,比如发布到另一个限界上下文。由于这样的事件由订阅方处理,它将对本地和远程上下文产生深远的影响。
那领域事件为什么要用最终一致性,而不是传统SOA的直接调用?
聚合的一个原则:一个事务中最多只能更改一个聚合实例。所以
-
本地限界上下文中的其他聚合实例便可以通过领域事件的方式同步
-
用于使远程依赖系统与本地系统保持一致。解耦本地系统和远程系统还有助于提高双方协作服务的可伸缩性。