软件架构之事件驱动架构

一、定义

事件驱动的架构是围绕事件的发布、捕获、处理和存储(或持久化)而构建的集成模型。 某个应用或服务执行一项操作或经历另一个应用或服务可能想知道的更改时,就会发布一个事件(也就是对该操作或更改的记录),另一个应用或服务便可以获取和处理该事件,继而执行更多操作。

二、基本原理

事件驱动架构以事件作为系统间通信的基本单位,系统中的各个组件通过发布和订阅事件来进行交互。基本原理包括以下几个要素:
1. 事件:事件是发生在系统中的某种动作或状态变化,它可以是用户操作,也可以是其他组件的响应。每个事件都有一个唯一的标识符,用于区别不同的事件类型。
2. 发布-订阅模式:在事件驱动架构中,系统中的某个组件可以发布(发布者)事件,而其他组件可以订阅(订阅者)这些事件。当有事件发布时,所有订阅该事件的组件都会收到通知。
3. 事件处理:事件的处理是事件驱动架构的核心。当一个事件被发布后,订阅该事件的组件会执行相应的事件处理函数。事件处理函数可以是系统内置的默认处理函数,也可以是开发者自定义的处理逻辑。
4. 事件传递:事件的传递是指事件在系统中的传递过程。一个事件可以触发其他事件的发布,从而形成事件链。事件传递可以是同步的,也可以是异步的,取决于具体的业务需求。

三、实现方式

事件驱动架构模式主要包含两种实现方式,分别是中介者拓扑(Mediator Topology),代理者拓扑(Broker Topology)。

3.1 中介者拓扑结构

中介者拓扑结构需要在一个事件通过 Mediator 时精心安排好具体的步骤,适合有多个步骤的事件。(有点工作流的感觉)。比如在交易系统中,每个请求流程必须经过特定的步骤,如验证、订单、配送,以及通知买家等。在这些步骤中,有些步骤是串行,有些可以并行完成。

主要包括 4 个基本组件:

  • 事件队列(event queue):接收事件的入口,存储待处理事件
  • 分发器(event mediator):将不同的事件分发到不同的业务逻辑单元
  • 事件通道(event channel):分发器与处理器之间的联系渠道
  • 事件处理器(event processor):实现业务逻辑,处理完成后会发出事件,触发下一步操作

示例:以一个处理保险流程的例子来说明,如图: 

 

3.2代理者拓扑(Broker Topology)

代理者拓扑主要由 Event Processor 和 Event Channel 构成,事件之间可能彼此是相互关联的。例如,一个 Event Processor 的处理结果是下一个 Event Processor 需要消费的事件,每个 Processor 必须完成自己的工作,其他 Processor 才能开始执行,整个事件处理过程像一条彼此相扣的链条,只有整个流程结束才能形成一个完整的业务逻辑。(类似于职责链或管道模式)。

 

 示例:同样以一个处理保险流程的例子来说明,如图:

四、优点与缺点
事件驱动架构可以实现系统的松耦合,使各个组件之间解耦,具有以下优点:

1. 可扩展性:通过事件驱动架构,可以方便地增加、修改或删除系统中的组件,而不会影响其他组件的正常运行。

2. 灵活性:每个组件可以独立开发和测试,不受其他组件的影响。这样可以更好地适应需求的变化或更新迭代。

3. 可重用性:事件驱动架构可以将特定的功能封装成独立的组件,使其可以在系统中的多个地方进行复用,减少重复开发的工作量。
4. 可测试性:由于各个组件之间解耦,可以更加方便地对单个组件进行单元测试和集成测试,提高系统的可测试性和稳定性。

缺点:

  1. 一旦环境变化,需要代码调整或增加功能时,通常比较麻烦和费时
  2. 部署比较麻烦,即使只修改一个小地方,往往需要整个软件重新部署,不容易做持续发布
  3. 软件升级时,可能需要整个服务暂停
  4. 扩展性差,用户请求大量增加时,必须依次扩展每一层,由于每一层内部是耦合的,扩展会很困难

参考:

事件驱动的架构 | IBM

事件驱动架构 - 光星の博客 

13种常见软件体系结构风格定义分析、结构图、优缺点_软件体系结构设计风格-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/338034.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Javaweb之SpringBootWeb案例的详细解析

SpringBootWeb案例 前面我们已经讲解了Web前端开发的基础知识,也讲解了Web后端开发的基础(HTTP协议、请求响应),并且也讲解了数据库MySQL,以及通过Mybatis框架如何来完成数据库的基本操作。 那接下来,我们就通过一个案例&#xf…

Linux驱动学习—输入子系统

1、什么是输入子系统? 输入子系统是Linux专门做的一套框架来处理输入事件的,像鼠标,键盘,触摸屏这些都是输入设备,但是这邪恶输入设备的类型又都不是一样的,所以为了统一这些输入设备驱动标准应运而生的。…

在IntelliJ IDEA上使用通义灵码(TONGYI Lingma)

参考链接: 通义灵码产品介绍_智能编码助手_AI编程_云效(Apsara Devops)-阿里云帮助中心 【IDEA如何使用通义灵码?】_idea 通义灵码-CSDN博客 1. 简介 1.1 定义 通义灵码,是阿里云出品的一款基于通义大模型的智能编码辅助工具,提…

缓存代理服务器

一、代理的工作机制 1、代替客户机向网站请求数据,从而可以隐藏用户的直实IP地址 2、将获得的网页数据(静态 web 元素) 保存到缓存中并发送给客户机,以便下次请求相同的数据时快速响应 二、代理服务器的概念及其作用 代理服务器是一个位于客户端和原…

vue3引用类型和基础类型深度克隆

深度克隆失效的一个例子 import { cloneDeep } from "lodash"; import { ref } from "vue";const navArr ref(["recommend","hot","new", ]) const list1: any ref([]) const list2: any ref([]) const list3: any ref(…

强化学习求解TSP(三):Qlearning求解旅行商问题TSP(提供Python代码)

一、Qlearning简介 Q-learning是一种强化学习算法,用于解决基于奖励的决策问题。它是一种无模型的学习方法,通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策,该函数表示在给定状态下采取某个动作所获…

【Spring 篇】注解之舞:Spring AOP的优雅表演

欢迎来到Spring的代码舞台,在这里,我们将沉浸在一场注解之舞的盛宴中。今天我们将探讨如何使用注解方式实现Spring AOP,一种优雅而富有表现力的编程技术。 AOP的魅力 在编程的舞台上,AOP(Aspect-Oriented Programmin…

CMU15-445-Spring-2023-Project #2 - 前置知识(lec07-010)

Lecture #07_ Hash Tables Data Structures Hash Table 哈希表将键映射到值。它提供平均 O (1) 的操作复杂度(最坏情况下为 O (n))和 O (n) 的存储复杂度。 由两部分组成: Hash Function和Hashing Scheme(发生冲突后的处理&…

[论文阅读]YOLO9000:Better,Faster,Stronger

摘要 我们引入了YOLO9000,一个可以检测超过9000种类别的先进的实时目标检测系统。首先我们提出了多种yolo检测方法的提升方式,既新颖又参考了 之前的工作。改进后的模型,YOLOV2在标准检测任务例如PASCAL VO 和COCO 上都取得了领先。使用一个…

每天学习一点点之 Spring Boot 1.x 升级 2.x 之 allowBeanDefinitionOverriding

最近组内大佬正在进行 Spring Boot 版本的升级,从 1.x 版本升级到 2.x 版本。在查看代码变更时,我注意到我之前编写的一个名为 ShardingRuleStrategy 的类被添加了 Primary 注解。这个类在原来的代码中被标记为 Component,同时也在 API 中被定…

Android开发基础(一)

Android开发基础(一) 本篇主要是从Android系统架构理解Android开发。 Android系统架构 Android系统的架构采用了分层的架构,共分为五层,从高到低分别是Android应用层(System Apps)、Android应用框架层&a…

Python基础知识:整理9 文件的相关操作

1 文件的打开 # open() 函数打开文件 # open(name, mode, encoding) """name: 文件名(可以包含文件所在的具体路径)mode: 文件打开模式encoding: 可选参数,表示读取文件的编码格式 """ 2 文件的读取 文…