java ddd 领域事件_领域驱动设计(DDD) 领域事件

何时and为什么使用领域事件

领域事件往往需要发布到外部系统,比如发布到另一个限界上下文中,由于这样的事件需要由订阅方处理,它将对本地和远程上下文产生深远的影响。

当领域事件到达目的地后,不论是本地还是外部系统,我们通常将领域事件用于维护事件的一致性,例如聚合的其中一个原则是单个事务只允许对一个聚合实例进行修改,由此产生的其他改变。另外,领域事件还可以使远程依赖系统与本地系统保持一致,而二者解耦有助于提高双方协作服务的可伸缩性。展示领域事件的产生、存储、分发和使用

作者同时指出,采用事件的形式捕获,然后将事件发布给订阅方处理,可以达到简化系统的目的。因为这样可以消除复杂查询,且知道何时发生了什么事,限界上下文也由此知道接下来该干什么。这样原本的批量集中处理过程可以分散成许多粒度较小的处理单元。

建模领域事件

在建模领域事件时,我们应该根据限界上下文中的通用语言来命名事件及其属性。事件的名字表明了聚合上的命令方法在执行成功之后发生的事情。有了正确的事件名之后我们需要时间戳表示事件发生的时间,Java 中可使用 java.util.Date。

从领域模型中发布领域事件

高效的发布领域事件的方法是使用观察者模式,其可以在领域模型和外部组件间解耦。

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

存在多种消息中间件,ActiveMQ、RabbitMQ等,我们也可以通过 RESTful 自己实现一套消息机制。对于消息的最终一致性,我们至少需要在两种存储介质之间保持最终一致性:领域模型所使用的持久化和消息设施所使用的持久化存储。方法有:共享持久化存储。性能高,缺点就是数据集聚

全局事务控制。可以分开存储,缺点是需要额外支持

创建事件存储

自治服务和系统

自治服务表示一个设计良好的业务服务,可以避免对RPC的使用,带来更高程度的独立性,简化系统间的依赖。在与远程系统交互时,客户方可以通过异步的消息来达到更高的独立性——自治性。

容许时延

数据不同步可能造成负面影响,有些业务服务可能需要更高的吞吐量,此时我们需要好好考虑最大容许时延,系统架构应该满足该需求。对于自治服务和支持它们的消息设施来说,应该在可用性和可伸缩性上下功夫。

转发存储事件的架构风格

一旦领域事件被保存在了事件存储中,我们可以对这些时间进行转发以通知其他系统。这种转发事件架构一种是基于 REST 资源一种是基于消息中间件。

参考资料

《实现领域驱动设计》美·弗农著

声明

封面图片来自 Unsplash

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值