首页 > 其他分享 >领域事件总体架构

领域事件总体架构

时间:2023-07-23 10:55:34浏览次数:37  
标签:总体 订阅 服务 领域 事件 消息中间件 架构 数据

1. 微服务内的领域事件

当领域事件发生在微服务内的聚合之间,领域事件发生后完成事件实体构建和事件数据持久化,发布方聚合将事件发布到事件总线,订阅方接收事件数据完成后续业务操作。

微服务内大部分事件的集成,都发生在同一个进程内,进程自身可以很好地控制事务,因此不一定需要引入消息中间件。但一个事件如果同时更新多个聚合,按照DDD“一次事务只更新一个聚合”的原则,你就要考虑是否引入事件总线。但微服务内的事件总线,可能会增加开发的复杂度,因此你需要结合应用复杂度和收益进行综合考虑。

微服务内应用服务,可以通过跨聚合的服务编排和组合,以服务调用的方式完成跨聚合的访问,这种方式通常应用于实时性和数据一致性要求高的场景。这个过程会用到分布式事务,以保证发布方和订阅方的数据同时更新成功。

2. 微服务之间的领域事件

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

领域事件发生在微服务之间的场景比较多,事件处理的机制也更加复杂。跨微服务的事件可以推动业务流程或者数据在不同的子域或微服务间直接流转。

跨微服务的事件机制要总体考虑事件构建、发布和订阅、事件数据持久化、消息中间件,甚至事件数据持久化时还可能需要考虑引入分布式事务机制等。

微服务之间的访问也可以采用应用服务直接调用的方式,实现数据和服务的实时访问,弊端就是跨微服务的数据同时变更需要引入分布式事务,以确保数据的一致性。分布式事务机制会影响系统性能,增加微服务之间的耦合,所以我们还是要尽量避免使用分布式事务。

领域事件的执行需要一系列的组件和技术来支撑。我们来看一下这个领域事件总体技术架构图,领域事件处理包括:事件构建和发布、事件数据持久化、事件总线、消息中间件、事件接收和处理等。

1. 事件构建和发布

事件基本属性至少包括:事件唯一标识、发生时间、事件类型和事件源,其中事件唯一标识应该是全局唯一的,以便事件能够无歧义地在多个限界上下文中传递。事件基本属性主要记录事件自身以及事件发生背景的数据。

另外事件中还有一项更重要,那就是业务属性,用于记录事件发生那一刻的业务数据,这些数据会随事件传输到订阅方,以开展下一步的业务操作。

事件基本属性和业务属性一起构成事件实体,事件实体依赖聚合根。领域事件发生后,事件中的业务数据不再修改,因此业务数据可以以序列化值对象的形式保存,这种存储格式在消息中间件中也比较容易解析和获取。

为了保证事件结构的统一,我们还会创建事件基类 DomainEvent(参考下图),子类可以扩充属性和方法。由于事件没有太多的业务行为,实现方法一般比较简单。

事件发布之前需要先构建事件实体并持久化。事件发布的方式有很多种,你可以通过应用服务或者领域服务发布到事件总线或者消息中间件,也可以从事件表中利用定时程序或数据库日志捕获技术获取增量事件数据,发布到消息中间件。

2. 事件数据持久化

事件数据持久化可用于系统之间的数据对账,或者实现发布方和订阅方事件数据的审计。当遇到消息中间件、订阅方系统宕机或者网络中断,在问题解决后仍可继续后续业务流转,保证数据的一致性。

事件数据持久化有两种方案,在实施过程中你可以根据自己的业务场景进行选择。

  • 持久化到本地业务数据库的事件表中,利用本地事务保证业务和事件数据的一致性。
  • 持久化到共享的事件数据库中。这里需要注意的是:业务数据库和事件数据库不在一个数据库中,它们的数据持久化操作会跨数据库,因此需要分布式事务机制来保证业务和事件数据的强一致性,结果就是会对系统性能造成一定的影响。

3. 事件总线(EventBus)

事件总线是实现微服务内聚合之间领域事件的重要组件,它提供事件分发和接收等服务。事件总线是进程内模型,它会在微服务内聚合之间遍历订阅者列表,采取同步或异步的模式传递数据。事件分发流程大致如下:

  • 如果是微服务内的订阅者(其它聚合),则直接分发到指定订阅者;
  • 如果是微服务外的订阅者,将事件数据保存到事件库(表)并异步发送到消息中间件;
  • 如果同时存在微服务内和外订阅者,则先分发到内部订阅者,将事件消息保存到事件库(表),再异步发送到消息中间件。

4. 消息中间件

跨微服务的领域事件大多会用到消息中间件,实现跨微服务的事件发布和订阅。消息中间件的产品非常成熟,市场上可选的技术也非常多,比如Kafka,RabbitMQ等。

5. 事件接收和处理

微服务订阅方在应用层采用监听机制,接收消息队列中的事件数据,完成事件数据的持久化后,就可以开始进一步的业务处理。领域事件处理可在领域服务中实现。

标签:总体,订阅,服务,领域,事件,消息中间件,架构,数据
From: https://www.cnblogs.com/15078480385zyc/p/17574771.html

相关文章

  • jquery双击事件绑定
    jQuery双击事件绑定jQuery是一种广泛使用的JavaScript库,它使开发者能够更方便地操作HTML文档、处理事件以及动态改变网页内容。在jQuery中,事件绑定是一种非常常见的操作,它允许开发者指定某个事件发生时应该执行的操作。其中,双击事件是一种特殊的事件,它在用户快速点击某个元素两次......
  • el-table中row-click事件调用两次接口问题
       参考:https://blog.csdn.net/jl____/article/details/126975029......
  • x86架构BIOS攻击面梳理与分析
    x86架构BIOS攻击面梳理与分析之前的一份学习笔记,主要整理了一下x86架构下BIOS的一些攻击面,BootKit部分还没有搬上来。可能有一些理解存在疏漏的地方,还请看官老爷斧正。调研目标一、梳理安全启动的基本流程经历的过程软硬件层面需要完成的工作二、梳理攻......
  • regexp对象、math对象、dom、bom、事件
    RegExp对象JS定义正则的两种方式varreg1=newRegExp("^[a-zA-Z][a-zA-Z0-9]{5,11}");第一种定义方式varreg2=/^[a-zA-Z][a-zA-Z0-9]{5,11}/第二种定义方式正则数据校验.test(‘数据’):匹配数据是否正确,匹配的位数超过正则的位数或者等于正则位数为ture,没有到达......
  • javaweb从入门到架构学习路线图?
    javaweb从入门到架构学习路线图?1.学习Java基础知识和面向对象编程的概念。2.了解计算机网络基础知识,包括HTTP协议、TCP/IP协议等。3.掌握HTML、CSS和JavaScript等前端技术,了解前后端交互原理和基本的前端开发技巧。4.学习基于Java的Web开发技术,包括Servlet、JSP等。5.深入学......
  • java分布式从入门到架构学习路线?
    java分布式从入门到架构学习路线?初级阶段:1.Java基础知识:掌握Java语言的基本语法、面向对象编程的概念、集合框架和异常处理等基础知识。2.网络编程:了解Java网络编程的基本概念,学习Socket编程和网络通信协议,掌握TCP/IP和HTTP协议的基本原理。3.分布式系统概念:理解分布式系统......
  • jquery写点击事件
    jQuery写点击事件在网页开发中,我们经常需要给页面元素添加交互功能,比如点击按钮触发某个操作。而jQuery是一个广泛使用的JavaScript库,它简化了DOM操作和事件处理等任务,使得我们能够更加方便地实现各种交互效果。本文将介绍如何使用jQuery编写点击事件,并提供相关的代码示例。什么......
  • jquery为多选框绑定事件
    jQuery为多选框绑定事件的实现步骤1.理解需求在开始编写代码之前,首先需要明确需求。根据题目要求,我们需要实现为多选框绑定事件,即当用户选择多选框时,触发相应的事件。2.引入jQuery库在使用jQuery之前,需要先引入jQuery库文件。可以通过在HTML文件中添加如下代码来引入jQuery库......
  • 基于TOGAF企业架构方法论的一站式企业架构管控平台
    远光天鹰企业架构管控平台帮助企业实现架构内容元模型的定义、架构设计、架构治理、架构管控与架构资产管理。借助天鹰,企业能够站在高处从战略全局查看企业架构,进行整体性、结构化的架构规划和设计、全方位的架构管控、高效的架构运营,实现企业战略的落地。 什么是企业架构?......
  • mongodb主从架构
    MongoDB主从架构实现简介在MongoDB中,主从架构又称为复制集(replset),是一种可用性和可靠性的解决方案。主从架构中,有一个主节点(Primary)和多个从节点(Secondary)。主节点负责处理所有的写操作和读操作,而从节点只负责读操作,通过复制主节点的数据保持与主节点的数据同步。流程下面是......