软件架构之事件驱动架构

一、定义

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

二、基本原理

事件驱动架构以事件作为系统间通信的基本单位,系统中的各个组件通过发布和订阅事件来进行交互。基本原理包括以下几个要素:
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博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Postman测试WebService接口

文章目录 使用Postman测试WebService接口1. 访问wsdl地址2. Postman配置1. URL及Headers设置2. Body设置3. 响应结果 使用Postman测试WebService接口 1. 访问wsdl地址 接口地址如:http://localhost:8101/ws/hello?wsdl 2. Postman配置 1. URL及Headers设置 2. B…

rime中州韵小狼毫 LaTex输入法配置

教程目录:rime中州韵小狼毫须鼠管安装配置教程 保姆级教程 100增强功能配置教程 本文的分享一种在rime中州韵小狼毫须鼠管输入法中配置LaTex输入方案的方法,并不完美,仅供参考。 先睹为快 LaTex输入方案可以快捷的在公式模式下输入一些基础…

【基础数据结构】字符串

一、字符串输入 1.scanf("%s",str);分隔符为空格、制表符、回车 2.fgets(str,10,stdin);10为字符串char str[10]长度,可以读取空格字符的字符串,10代表最大读取长度,最多读取9个字符,这个函数自动在读取到换行符停止&…

深度强化学习的变道策略:Harmonious Lane Changing via Deep Reinforcement Learning

偏理论,假设情况不易发生 摘要 多智能体强化学习的换道策略,不同的智能体在每一轮学习后交换策略,达到零和博弈。 和谐驾驶仅依赖于单个车辆有限的感知结果来平衡整体和个体效率,奖励机制结合个人效率和整体效率的和谐。 Ⅰ. 简…

数据仓库面试题

1 思维导图&数仓常见面试题 2 题目 1. 数据仓库是什么? 数据仓库是一个面向主题的(订单、支付、退单等)、集成的(整合多个信息源的大量数据)、非易失的(一般不会进行删除和修改操作)且随时…

基于NLP的恶意网页识别

基于NLP的恶意网页识别 基于NLP的恶意网页识别引言项目目录回顾优化HTML标签提取结果使用预训练模型Fine-tune数据处理和模型训练模型训练与评估模型导出部署与预测总结 基于NLP的恶意网页识别 引言 欢迎阅读《 基于NLP的恶意网页识别》,在前三篇中,我…

【LV12 DAY21 PWM实验】

PWM控制—脉冲宽度调制 通过对脉冲宽度的调制,来获得所需要的波形。 #include "exynos_4412.h"void delay(unsigned int time){while(time--);}int main(){//1.配置GPD0_0 PWM输出功能GPD0.CONGPD0.CON &(~(0XF)) | 0X2;//2.设置PWM一级分频100P…

Flask框架小程序后端分离开发学习笔记《1》网络知识

Flask框架小程序后端分离开发学习笔记《1》网络知识 Flask是使用python的后端,由于小程序需要后端开发,遂学习一下后端开发。 一、网址组成介绍 协议:http,https (https是加密的http)主机:g.cn zhihu.com之类的网址…

视频转码:最简单的批量MP4视频转换方法,视频剪辑的技巧

随着数字媒体技术的快速发展,视频格式的转换和编辑已成为日常生活中常见的需求。经常遇到要把不同格式的视频转换成MP4格式的情况,例如在某些播放器或设备上播放,或者传输和分享。接下来看下云炫AI智剪如何简单的批量转换MP4视频方法&#xf…

实战案例 - 医疗行业攻击面发现及管理

HIS 入侵案例 医院委托第三方安全公司进行渗透测试 公网域名发现 HIS 系统,通过域名访问并进行入侵 植入木马后,被 HIDS 发现并处置 通过 HIDS 发现 HIS 系统存在已知安全漏洞 通报院方负责人进行处理 院方负责人 仅关闭对应系统域名解析 HW 演练时…

爬虫IP代理池的搭建与使用指南

目录 前言 一、IP代理池的搭建 1. 安装依赖库 2. 获取代理IP 3. 验证代理IP 4. 搭建代理池 5. 定时更新代理池 二、使用IP代理池 总结 前言 在进行网络爬虫任务时,为了避免被目标网站封禁IP,我们可以使用IP代理池来进行IP的轮换,达…

linux修改文件名

1.使用 mv 命令:mv 命令用于移动或重命名文件。要重命名一个文件,你可以将原始文件名作为第一个参数,新的文件名作为第二个参数传递给 mv 命令。例如,要将 oldfile.txt 重命名为 newfile.txt,可以运行以下命令&#xf…

【江科大STM32合集】day2按键控制LED光敏传感器控制峰鸣器

【STM32合集】day2按键控制LED&光敏传感器控制峰鸣器 电路基础c语言基础main.ckey.c结果 实现一个键开关灯实验结果避坑 电路基础 运算放大器-在江科大51单片机b站视频(AD/DA)复习 原理:两个极端 同相输入端电压 》反相输入端 电压输出最…

3DMax的位图是什么? 3DMax的位图介绍

在3dmax建模中,使用贴图时的位图的频率是很高的。主要原因便就是位图就是我们平常说的图片,有各种格式的图片,能把这张图片贴到物体的表面,呈现效果进行渲染。 3damx的位图支持多种格式,比如jpg、png等等。 当然常用的…

第8章-第4节-Java中字节流的缓冲流

1、缓冲流:属于高级IO流,并不能直接读写数据,需要依赖于基础流。缓冲流的目的是为了提高文件的读写效率?那么是如何提高文件的读写效率的呢? 在内存中设置一个缓冲区,缓冲区的默认大小是8192字节&#xff…

HarmonyOS4.0 系列——06、渲染之条件渲染、循环渲染以及懒加载渲染

HarmonyOS4.0 系列——06、渲染之条件渲染、循环渲染以及懒加载渲染 if/else:条件渲染 ArkTS 提供了渲染控制的能力。条件渲染可根据应用的不同状态,使用 if、else 和 else if 渲染对应状态下的 UI 内容。 写法和 TS 的一样,简单看一下即可…

java的object类

object类 看下object类的结构: Object是所有类的父类,任何类都默认继承Object。在Java中,如果没有指定父类,则默认为Object。这是因为Object类是Java中最基本的类,也是所有类的祖先 public String toString() : 这…

Windows下Python+PyCharm+miniconda+Cuda/GPU 安装步骤

1. 官网安装Python 3.9 Python Release Python 3.9.0 | Python.org 2. 安装pycharm https://download.jetbrains.com/python/pycharm-professional-2023.3.2.exe 3. 安装miniconda Miniconda — miniconda documentation 4. 安装完miniconda 创建虚拟环境 conda create …

Linux命令之用户账户管理whoami,useradd,passwd,chage,usermod,userdel的使用

1、查看当前用户账户 2、切换用户为root用户 3、新建用户user1,给用户user1设置密码为password123 4、新建用户user2,UID为510,指定其所属的私有组为group1(group1组的标识符为500),用户的主目录为/home/us…

6.1810: Operating System Engineering 2023 <Lab7 lock: Parallelism/locking>

一、本节任务 二、要点 2.1 文件系统(file system) xv6 文件系统软件层次如下: 通过路径树我们可以找到相应的文件: fd(文件描述符)是进程用来标识其打开的文件的手段,每个进程有自己的文件…