当前位置: 首页 > news >正文

软件架构之事件驱动架构

一、定义

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

二、基本原理

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

相关文章:

软件架构之事件驱动架构

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

C++ 后端面试 - 题目汇总

文章目录 🍺 非技术问题🍻 基本问题🥂 请自我介绍?🥂 你有什么问题需要问我的? 🍻 加班薪资🥂 你对加班有什么看法?🥂 你的薪资期望是多少?【待回…...

zds1104示波器使用指南

1、设置语言 2、功能检测验证示波器是否正常工作 3、示波器面板按钮详解 3.1、软键 3.2、运行控制与操作区 3.3、水平控制区 3.4、垂直控制区 3.5、多功能控制区 3.6、断电启动恢复,auto setup,default setup,恢复出厂设置详细解释 3.7、触…...

uni-app修改头像和个人信息

效果图 代码&#xff08;总&#xff09; <script setup lang"ts"> import { reqMember, reqMemberProfile } from /services/member/member import type { MemberResult, Gender } from /services/member/type import { onLoad } from dcloudio/uni-app impor…...

IDEA 中搭建 Spring Boot Maven 多模块项目 (父SpringBoot+子Maven)

第1步&#xff1a;新建一个SpringBoot 项目 作为 父工程 [Ref] 新建一个SpringBoot项目 删除无用的 .mvn 目录、 src 目录、 mvnw 及 mvnw.cmd 文件&#xff0c;最终只留 .gitignore 和 pom.xml 第2步&#xff1a;创建 子maven模块 第3步&#xff1a;整理 父 pom 文件 ① …...

竞赛保研 基于计算机视觉的身份证识别系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器视觉的身份证识别系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-sen…...

在visual studio中调试时无法查看std::wstring

1.问题 在调试的时候发现std::wstring类型的变量查看不了&#xff0c;会显示(error)|0&#xff0c;百思不得其解。 2.解决方法 参考的&#xff1a;vs2015调试时无法显示QString变量的值&#xff0c;只显示地址_vs调试qstring的时候如何查看字符串-CSDN博客 在工具/选项/调试…...

2023年全国职业院校技能大赛高职组应用软件系统开发正式赛题—模块三:系统部署测试

模块三&#xff1a;系统部署测试&#xff08;3 小时&#xff09; 一、模块考核点 模块时长&#xff1a;3 小时模块分值&#xff1a;20 分本模块重点考查参赛选手的系统部署、功能测试、Bug 排查修复及文档编写能力&#xff0c;具体包括&#xff1a;系统部署。将给定项目发布到…...

微信小程序上传并显示图片

实现效果&#xff1a; 上传前显示&#xff1a; 点击后可上传&#xff0c;上传后显示&#xff1a; 源代码&#xff1a; .wxml <view class"{{company_logo_src?blank-area:}}" style"position:absolute;top:30rpx;right:30rpx;height:100rpx;width:100rp…...

java基础知识点系列——数据输入(五)

java基础知识点系列——数据输入&#xff08;五&#xff09; 数据输入概述 Scanner使用步骤 &#xff08;1&#xff09;导包 import java.util.Scanner&#xff08;2&#xff09;创建对象 Scanner sc new Scanner(System.in)&#xff08;3&#xff09;接收数据 int i sc…...

MySQL面试题 | 07.精选MySQL面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…...

C语言中关于指针的理解及用法

关于指针意思的参考&#xff1a;https://baike.baidu.com/item/%e6%8c%87%e9%92%88/2878304 指针 指针变量 地址 野指针 野指针就是指针指向的位置是不可知的&#xff08;随机的&#xff0c;不正确的&#xff0c;没有明确限制的&#xff09; 以下是导致野指针的原因 1.指针…...

软件测试|深入理解Python中的re.search()和re.findall()区别

前言 在Python中&#xff0c;正则表达式是一种强大的工具&#xff0c;用于在文本中查找、匹配和处理模式。re 模块提供了许多函数来处理正则表达式&#xff0c;其中 re.search()和 re.findall() 是常用的两个函数&#xff0c;用于在字符串中查找匹配的模式。本文将深入介绍这两…...

❤ Vue3 完整项目太白搭建 Vue3+Pinia+Vant3/ElementPlus+typerscript(一)yarn 版本控制 ltb (太白)

❤ 项目搭建 一、项目信息 Vue3 完整项目搭建 Vue3PiniaVant3/ElementPlustyperscript&#xff08;一&#xff09;yarn 版本控制 项目地址&#xff1a; 二、项目搭建 &#xff08;1&#xff09;创建项目 yarn create vite <ProjectName> --template vueyarn install …...

linux搭建SRS服务器

linux搭建SRS服务器 文章目录 linux搭建SRS服务器SRS说明实验说明搭建步骤推流步骤查看web端服务器拉流步骤final SRS说明 SRS&#xff08;simple Rtmp Server&#xff09;,是一个简单高效的实时视频服务器&#xff0c;支持RTMP/WebRTC/HLS/HTTP-FLV/SRT, 是国人自己开发的一款…...

系列六、Spring Security中的认证 授权 角色继承

一、Spring Security中的认证 & 授权 & 角色继承 1.1、概述 关于Spring Security中的授权&#xff0c;请参考【系列一、认证 & 授权】&#xff0c;这里不再赘述。 1.2、资源类 /*** Author : 一叶浮萍归大海* Date: 2024/1/11 20:58* Description: 测试资源*/ Re…...

云原生周刊:OpenTofu 宣布正式发布 | 2023.1.15

开源项目推荐 kubeaudit kubeaudit 是一个开源项目&#xff0c;旨在帮助用户对其 Kubernetes 集群进行常见安全控制的审计。该项目提供了工具和检查规则&#xff0c;可以帮助用户发现潜在的安全漏洞和配置问题。 Chronos Chronos 是一款综合性开发人员工具&#xff0c;可监…...

【如何在 GitHub上面找项目】【转载】

很多的小伙伴&#xff0c;经常会有这样的困惑&#xff0c;我看了很多技术的学习文档、书籍、甚至视频&#xff0c;我想动手实践&#xff0c;于是我打开了GitHub&#xff0c;想找个开源项目&#xff0c;进行学习&#xff0c;获取项目实战经验。这个时候很多小伙伴就会面临这样的…...

java每日一题——ATM系统编写(答案及编程思路)

前言&#xff1a; 基础语句学完&#xff0c;也可以编写一些像样的程序了&#xff0c;现在要做的是多加练习&#xff0c;巩固下知识点&#xff0c;打好基础&#xff0c;daydayup! 题目&#xff1a;模仿银行ATM系统&#xff0c;可以创建用户&#xff0c;存钱&#xff0c;转账&…...

《TrollStore巨魔商店》TrollStore2安装使用教程支持IOS14.0-16.6.1

TrollStore(巨魔商店) 简单的说就相当于一个永久的免费证书&#xff0c;它可以给你的iPhone和iPad安装任何你想要安装的App软件&#xff0c;而且不需要越狱,不用担心证书签名过期的问题&#xff0c;不需要个人签名和企业签名。 支持的版本&#xff1a; TrollStore安装和使用教…...

告别手动逐个校验,用快马快速构建vmware密钥批量验证工具提升效率

告别手动逐个校验&#xff0c;用快马快速构建vmware密钥批量验证工具提升效率 最近在帮朋友处理一批VMware16的密钥验证工作&#xff0c;发现手动逐个检查不仅耗时耗力&#xff0c;还容易出错。特别是当需要验证几十甚至上百个密钥时&#xff0c;这种重复劳动简直让人崩溃。于…...

2026别墅地下室保养升值的最好方法:电渗透技术的应用

别墅地下室随着人们日益增长的生活质量&#xff0c;功能也逐渐变得丰厚。当今时代不少业主都会在地下室加装健身房&#xff0c;酒窖以及影视厅等。这些功能区建设完毕初期给人无不良影响&#xff0c;但是随着时间的渐长&#xff0c;湿气不断渗透&#xff0c;首先空气潮湿度会给…...

璀璨星河效果展示:古典结构×现代张力的Z-Image原生艺术生成

璀璨星河效果展示&#xff1a;古典结构现代张力的Z-Image原生艺术生成 “我梦见了画&#xff0c;然后画下了梦。” —— 文森特 梵高 今天&#xff0c;我想带你走进一个特别的数字艺术馆。在这里&#xff0c;冰冷的代码逻辑与炽热的艺术灵魂相遇&#xff0c;古典的审美结构与现…...

手机号码智能定位系统:从技术原理到行业实践

手机号码智能定位系统&#xff1a;从技术原理到行业实践 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mirrors/lo/lo…...

tao-8k Embedding模型部署教程:支持中文长文本的高兼容性向量服务

tao-8k Embedding模型部署教程&#xff1a;支持中文长文本的高兼容性向量服务 你是不是遇到过这样的问题&#xff1f;想把一段很长的中文文档&#xff0c;比如一篇技术报告、一份产品说明书&#xff0c;甚至是一本小说的章节&#xff0c;转换成计算机能理解的向量&#xff0c;…...

Java车载HMI卡顿问题终极解析,GPU渲染线程阻塞+Binder调用链路断点调试(附AS+ADB定制脚本)

第一章&#xff1a;Java车载HMI卡顿问题的系统性认知车载人机交互界面&#xff08;HMI&#xff09;作为智能座舱的核心入口&#xff0c;其响应流畅度直接影响用户安全与体验。当基于Java&#xff08;如Android Automotive OS或定制JVM嵌入式框架&#xff09;构建的HMI出现卡顿&…...

忍者像素绘卷代码实例:Python调用Z-Image-Turbo-rinaiqiao模型避坑指南

忍者像素绘卷代码实例&#xff1a;Python调用Z-Image-Turbo-rinaiqiao模型避坑指南 1. 环境准备与快速部署 在开始使用忍者像素绘卷之前&#xff0c;我们需要先搭建好Python环境并安装必要的依赖库。这个模型基于Z-Image-Turbo深度优化&#xff0c;特别适合生成16-Bit复古风格…...

终极窗口管理指南:如何让重要窗口始终置顶提升3倍工作效率

终极窗口管理指南&#xff1a;如何让重要窗口始终置顶提升3倍工作效率 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 你是否曾经在视频会议时&#xff0c;会议窗口突然被弹出的…...

PasteMD实际作品:将播客文字稿→带时间戳/嘉宾标注/知识点标签的Markdown

PasteMD实际作品&#xff1a;将播客文字稿→带时间戳/嘉宾标注/知识点标签的Markdown 1. 项目简介 PasteMD是一款基于本地Ollama框架构建的智能文本格式化工具&#xff0c;专门解决日常工作中遇到的文本整理难题。无论你是从会议记录、播客转录还是笔记草稿中获取的杂乱文本&…...

OpenClaw+Phi-3-vision-128k-instruct:技术文档的自动化截图更新方案

OpenClawPhi-3-vision-128k-instruct&#xff1a;技术文档的自动化截图更新方案 1. 为什么需要自动化文档更新 作为一名技术文档维护者&#xff0c;我经常遇到一个令人头疼的问题&#xff1a;当代码库更新后&#xff0c;文档中的示例截图往往滞后于实际运行效果。上周就发生过…...