美文网首页
基于领域事件实现微服务解耦

基于领域事件实现微服务解耦

作者: 程序员财富自由之路 | 来源:发表于2020-11-04 11:42 被阅读0次

基于领域事件实现微服务解耦

领域事件是解耦微服务的关键。

什么是领域事件

除了命令和操作等业务行为,还有一种非常重要的事件,这种事件通常会导致进一步的业务操作,在DDD(Domain Driven Design,领域驱动设计)中,这种事件叫做 领域事件。

领域事件可以是业务流程中的一个步骤。 比如,投保业务缴费之后,投保单转为保单。支付成功后,生产商品订单。这里的支付就是一个领域事件。或者是一个事件发生后触发进一步操作, 比如,密码连续输入错误3次,账户锁定。这里的密码输入就是一个领域事件。

如何识别领域事件

用户旅程或者场景分析时,捕捉业务/需求人员或者领域专家口中的关键词:

  • 如果发生 。。。。,则。。。
  • 完。。。。的时候,请通知。。。
  • 发生。。。。时,则。。。

微服务之间的领域事件

跨微服务的领域事件会在不同界限上下文或领域模型直接实现业务协助,主要目的是实现微服务解耦。减轻微服务直接实现服务访问的压力。

举个例子:

当用户在购物车点击结算时,生成待付款订单,若支付成功,则更新订单状态为已支付,扣减库存,并推送捡货通知信息到捡货中心。

在你没有接触领域事件或EDA(事件驱动架构)之前,你会如何实现这个用例? 肯定是简单直接的方法调用,在一个事务中分别去调用状态更新方法、扣减库存方法、发送捡货通知方法。

上面的实现有什么问题?

  • 试想一下,若现在要求支付成功后,需要额外发送一条付款成功通知到微信公众号,我们怎么实现?想必我们需要额外定义发送微信通知的接口并封装参数,然后再添加对方法的调用。这种做法虽然可以解决需求的变更,但很显然不够灵活耦合性强,也违反了OCP。
  • 将多个操作放在同一个事务中,使用事务一致性可以保证多个操作要么全部成功要么全部失败。在一个事务中处理多个操作,若其中一个操作失败,则全部失败。但是,这在业务上是不允许的。客户成功支付了,却发现订单依旧为待付款,这会导致纠纷的。
  • 违反了聚合的一大原则:在一个事务中,只对一个聚合进行修改。在这个用例中,很明显我们在一个事务中对订单聚合和库存聚合进行了修改。

如果基于领域事件如何实现?

领域事件建模

  1. 事件源 entry
  2. 事件对象 domainMessage = 事件类型 eventTopic + 事件源 entry
  3. 事件监听器 subscribe 处理事件
  4. 事件分发器 注册监听器 JvmEventConsumer
  5. 生产消息 实时消费,producer中直接consume 或者 MQ的形式,异步消费
图片.png

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

为啥基于领域事件驱动的设计能够实现系统解耦?

关键是因为居于事件驱动架构 【Event-Driven Architecture(事件驱动架构))】

事件驱动架构有三个特性:

  1. 异步
  2. 实时
  3. 彻底解耦

EDA 架构的核心是基于消息的发布订阅模式,通过发布订阅,消息消费方对于消息发送方而言是完全透明的,发送方只是把消息正常发送到消息中间件,其他的不关心, 及时发送消息的时候,消息接收方不可用,消息生产者仍然可以发送消息,这样实现了系统间的彻底解耦,不存在系统间的依赖。

总结

领域事件是 DDD 的重要概念,设计时需要关注领域事件,用领域事件来驱动业务流转,尽量采用事件的最终一致性,降低微服务直接的耦合,实现微服务间的解耦,维护领域模型的独立性和数据一致性。

参考资料:

欢迎关注公众号:程序员开发者社区

相关文章

  • 基于领域事件实现微服务解耦

    基于领域事件实现微服务解耦 领域事件是解耦微服务的关键。 什么是领域事件 除了命令和操作等业务行为,还有一种非常重...

  • 基于消息队列解耦服务

    业务场景描述 每日签到,签到后赠送积分。签到和赠送积分分属于开发团队,作为两个微服务开发部署。 传统方式 一般情况...

  • InterView Plan 0210

    0210 1.BroadcastReicever (1)观察者模式,基于消息的发布/订阅事件模型,解耦; (2)A...

  • 基于Spring事件的领域事件实现

    本文探讨如下问题: 什么是领域事件 领域事件的用途 何时使用领域事件 基于Spring事件的实现 什么是领域事件 ...

  • Dubbo

    基于服务的架构演变:单一应用>MVC分层应用>微服务(解耦)系统间调用方式:webservice>httpclie...

  • 解耦

    解耦 对于大型重构, 最有效的手段就是 解耦, 解耦的目的使实现代码高聚合、松耦合。 解耦为何如此...

  • Ⅲ.kafka

    一、定义 基于消息发布与订阅的消息队列中间件。 二、作用 解耦:实现生产端与消费端的解耦削峰:消息峰值时可做缓存,...

  • 《编写可测试javascript》 第三章 基于事件的架构

    通过事件解耦和隔离代码是javascript的一个原生特性,参考浏览器的DOM事件模型 3.1 基于事件的好处 应...

  • EventBus简单实现

    EventBus 是一种事件发布订阅模式,通过 EventBus 我们可以很方便的实现解耦,将事件的发起和事件的处...

  • 使用 Spring Cloud Stream 构建消息驱动微服务

    相关源码: spring cloud demo 微服务的目的: 松耦合 事件驱动的优势:高度解耦 Spring C...

网友评论

      本文标题:基于领域事件实现微服务解耦

      本文链接:https://www.haomeiwen.com/subject/kafgvktx.html