事件驱动架构(EDA)
事件驱动架构(Event-Driven Architecture, EDA)是一种软件架构模式,其中系统的行为由事件的产生和处理驱动。在这种架构中,系统的组件通过事件进行交互,而不是通过直接的调用或者请求响应方式。
关键概念
-
事件(Event):事件是系统中某个重要动作的表示,通常是某个状态变化的通知。事件可以是用户操作、系统状态变化、外部系统消息等。
-
事件源(Event Source):事件源是产生事件的实体,可能是用户界面、后台服务、硬件设备等。当某个特定的操作发生时,事件源会生成一个事件。
-
事件处理器(Event Handler):事件处理器是响应并处理事件的组件。它接收到事件后,执行某种动作或任务。例如,数据库更新、外部系统调用等。
-
事件总线(Event Bus):事件总线是负责传递事件的中间件,它连接事件源和事件处理器。它的作用是将事件从源发送到合适的处理器,可能是一个消息队列或消息中间件。
-
订阅/发布机制(Publish/Subscribe):事件驱动架构通常使用订阅/发布模式。发布者(事件源)发布事件,订阅者(事件处理器)对特定类型的事件感兴趣,并作出响应。
工作流程:
- 事件触发:系统中的某个组件(如用户操作、定时任务等)触发事件。
- 事件传输:事件通过事件总线或消息队列传输,传递给相关的组件。
- 事件处理:一个或多个事件处理器接收到事件后,执行相应的操作,如更新数据库、调用其他服务、通知用户等。
- 结果返回:如果需要,事件处理器可能会产生新的事件,继续触发后续的操作。
优点:
- 松耦合:组件之间通过事件解耦,减少了直接依赖,可以独立开发和部署。
- 可伸缩性:可以轻松添加新的事件处理器,或者扩展现有的处理逻辑,不会影响其他部分。
- 实时性:事件驱动架构适合处理实时数据流或异步操作,能够快速响应外部变化。
- 异步处理:可以通过异步消息队列进行事件传递,避免了同步调用带来的阻塞。
缺点:
- 复杂性:事件驱动架构可能导致系统的整体复杂性增加,尤其是事件流管理、日志追踪和错误处理。
- 调试困难:由于事件的异步性和分布式特性,系统的调试和错误排查可能更加困难。
- 事件顺序:有时候事件的顺序会影响系统的行为,需要处理好事件的顺序问题。
使用场景:
- 微服务架构:在微服务中,服务之间的解耦通常采用事件驱动的方式,使用消息队列、Kafka 等来进行事件传递。
- 实时数据流处理:比如金融交易系统、社交网络推送、物联网设备管理等,需要根据实时发生的事件来做出响应。
- 异步任务处理:例如,系统的某些任务需要异步执行,可以通过事件通知来触发任务处理。
示例:
- 电商平台:用户下单时,会触发一个 “订单已创建” 的事件。订单服务处理该事件后,可能会触发库存更新、支付处理、物流派单等后续事件,形成一系列的操作。
- 实时消息系统:每当用户发送消息时,会生成一个事件,消息服务处理该事件后将消息推送到其他相关用户的客户端,用户通过客户端订阅接收到消息。
事件驱动架构是一种非常灵活且适用于多种复杂场景的架构模式,特别适合需要实时、异步、可扩展的系统。
使用Python 3和Redis实现一个简单的事件驱动架构(EDA)
通过Redis的消息队列功能(pub/sub
)来模拟事件的发布与订阅机制。这种方式体现了事件驱动架构中的松耦合、异步处理以及事件传递等核心思想。
主要步骤:
- 事件源:发布事件。
- 事件处理器:订阅并处理事件。
- Redis Pub/Sub:作为事件总线,用于发布和订阅事件。
安装依赖:
首先,安装 Redis 和 redis-py
库:
pip install redis
确保本地已安装并启动了Redis服务。如果没有,可以通过 Redis官网 下载并启动。
代码实现:
1. 发布事件(事件源)
我们将模拟一个事件源,它负责发布事件到Redis频道。
import redis
import time
import jsondef publish_event(redis_client, event_data):# 将事件转换为JSON格式event = json.dumps(event_data)# 发布到 "event_channel" 频道redis_client.publish("event_channel", event)print(f"Event published: {event_data}")if __name__ == "__main__":# 创建Redis连接redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)# 模拟事件发布while True:event_data = {"event": "order_created", "order_id": 12345, "user_id": 67890}publish_event(redis_client, event_data)time.sleep(5) # 每5秒发布一个事件
2. 订阅和处理事件(事件处理器)
订阅Redis频道并处理接收到的事件。
import redis
import jsondef handle_event(event_data):# 事件处理逻辑,可以是各种业务操作print(f"Event handled: {event_data}")def subscribe_to_events(redis_client):pubsub = redis_client.pubsub()pubsub.subscribe("event_channel")print("Subscribed to event_channel.")# 持续监听并处理事件for message in pubsub.listen():if message["type"] == "message":event_data = json.loads(message["data"])handle_event(event_data)if __name__ == "__main__":# 创建Redis连接redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)# 启动事件处理器,监听并处理事件subscribe_to_events(redis_client)
3. 如何运行:
- 启动事件处理器脚本(
event_handler.py
)。 - 启动事件源脚本(
event_source.py
)。 - 每5秒,事件源将发布一个新的事件(如“订单创建”),事件处理器将接收到该事件并执行相应的业务逻辑。
4. 示例输出:
事件源输出:
Event published: {'event': 'order_created', 'order_id': 12345, 'user_id': 67890}
事件处理器输出:
Subscribed to event_channel.
Event handled: {'event': 'order_created', 'order_id': 12345, 'user_id': 67890}
解释:
- 事件源 (
event_source.py
) 负责生成事件并将其发布到 Redis 的event_channel
频道。这些事件是异步产生的,可以随时发生。 - 事件处理器 (
event_handler.py
) 使用 Redis 的pub/sub
机制订阅event_channel
频道。当事件到达时,事件处理器会接收到并处理该事件,进行相应的业务操作。
核心思想体现:
- 松耦合:事件源与事件处理器不直接交互,它们通过 Redis 进行通信。事件源只负责发布事件,而事件处理器只负责订阅并处理事件。
- 异步处理:事件发布和事件处理是异步进行的,事件发布后无需等待处理器的反馈,处理器可以并行处理多个事件。
- 可扩展性:可以轻松添加更多的事件源和事件处理器,只需向 Redis 中发布和订阅不同的频道即可。
- 事件驱动:系统行为被事件驱动,事件的产生和消费控制了系统的流转。
扩展:
- 多个事件处理器:可以在不同的服务中部署多个事件处理器,每个处理器订阅同一个频道并处理不同的业务。
- 更多事件类型:可以设计多个不同类型的事件,比如
order_created
、payment_successful
等,根据业务需求来定义事件结构。
这种实现方式展示了如何使用 Redis 作为一个事件总线,来实现松耦合、异步的事件驱动架构。
相关文章:
事件驱动架构(EDA)
事件驱动架构(Event-Driven Architecture, EDA)是一种软件架构模式,其中系统的行为由事件的产生和处理驱动。在这种架构中,系统的组件通过事件进行交互,而不是通过直接的调用或者请求响应方式。 关键概念 事件&#x…...

C++ 入门速通-第5章【黑马】
内容来源于:黑马 集成开发环境:CLion 先前学习完了C第1章的内容: C 入门速通-第1章【黑马】-CSDN博客 C 入门速通-第2章【黑马】-CSDN博客 C 入门速通-第3章【黑马】-CSDN博客 C 入门速通-第4章【黑马】-CSDN博客 下面继续学习第5章&…...
2025春招,深度思考MyBatis面试题
大家好,我是V哥,2025年的春招马上就是到来,正在准备求职的朋友过完年,也该收收心,好好思考一下自己哪些技术点还需要补一补了,今天 V 哥要跟大家聊的是MyBatis框架的问题,站在一个高级程序员的角…...

排序算法--冒泡排序
冒泡排序虽然简单,但在实际应用中效率较低,适合小规模数据或教学演示。 // 冒泡排序函数 void bubbleSort(int arr[], int n) {for (int i 0; i < n - 1; i) { // 外层循环控制排序轮数for (int j 0; j < n - i - 1; j) { // 内层循环控制每轮比…...

简易C语言矩阵运算库
参考网址: 异想家纯C语言矩阵运算库 - Sandeepin - 博客园 这次比opencv快⑥倍!!! 参考上述网址,整理了一下代码: //main.c#include <stdio.h> #include <stdlib.h> #include <string.h…...
通过C/C++编程语言实现“数据结构”课程中的链表
引言 链表(Linked List)是数据结构中最基础且最重要的线性存储结构之一。与数组的连续内存分配不同,链表通过指针将分散的内存块串联起来,具有动态扩展和高效插入/删除的特性。本文将以C/C++语言为例,从底层原理到代码实现,手把手教你构建完整的链表结构,并深入探讨其应…...

【分布式架构理论3】分布式调用(2):API 网关分析
文章目录 一、API 网关的作用1. 业务层面:简化调用复杂性2. 系统层面:屏蔽客户端调用差异3. 其他方面: 二、API 网关的技术原理1. 协议转换2. 链式处理3. 异步请求机制1. Zuul1:同步阻塞处理2. Zuul2:异步非阻塞处理 三…...
基于Kamailio、MySQL、Redis、Gin、Vue.js的微服务架构
每个服务使用一台独立的服务器的可行部署方案,尤其是在高并发、高可用性要求较高的场景中。这种方案通常被称为分布式部署或微服务架构。以下是针对您的VoIP管理系统(基于Kamailio、MySQL、Redis、Gin、Vue.js)的详细分析和建议。 1. 分布式部…...

6S模型的编译问题解决
使用python处理遥感光谱数据,免不了进行大气校正,基本上免费的就是使用Py6s,而py6s库只是一个接口,还需要自己配置6S模型,可以查到很多资料,6S模型是古老的fortran语言写的,基本配置流程就是安装…...

C++11详解(二) -- 引用折叠和完美转发
文章目录 2. 右值引用和移动语义2.6 类型分类(实践中没什么用)2.7 引用折叠2.8 完美转发2.9 引用折叠和完美转发的实例 2. 右值引用和移动语义 2.6 类型分类(实践中没什么用) C11以后,进一步对类型进行了划分&#x…...

实验十四 EL和JSTL
实验十四 EL和JSTL 一、实验目的 1、掌握EL表达式的使用 2、掌握JSTL的使用 二、实验过程 1、在数据库Book中建立表Tbook,包含图书ID,图书名称,图书价格。实现在bookQuery.jsp页面中模糊查询图书,如果图书的价格在50元以上&#…...

为什么在springboot中使用autowired的时候它黄色警告说不建议使用字段注入
byType找到多种实现类导致报错 Autowired: 通过byType 方式进行装配, 找不到或是找到多个,都会抛出异常 我们在单元测试中无法进行字段注入 字段注入通常是 private 修饰的,Spring 容器通过反射为这些字段注入依赖。然而,在单元测试中&…...

DeepSeek大模型介绍、本地化部署与使用!【AI大模型】
一、DeepSeek 是什么? 1.技术定位 专注大模型与AGI研究,开发高性能基座模型(如 DeepSeek LLM 系列),支持长文本、多模态、代码生成等复杂任务。 提供开源模型(如 DeepSeek-MoE、DeepSeek-V2)…...

备考蓝桥杯嵌入式4:使用LCD显示我们捕捉的PWM波
上一篇博客我们提到了定时器产生PWM波,现在,我们尝试的想要捕获我们的PWM波,测量它的频率,我们应该怎么做呢?答案还是回到我们的定时器上。 我们知道,定时器是一个高级的秒表(参考笔者的比喻&a…...
智能化转型2.0:从“工具应用”到“价值重构”
过去几年,“智能化”从一个模糊的概念逐渐成为企业发展的核心议题。2024年,随着生成式AI、大模型、智能体等技术的爆发式落地,中国企业正式迈入智能化转型的2.0时代。这一阶段的核心特征是从单一场景的“工具应用”转向全链条的“价值重构”&…...

机器学习之数学基础:线性代数、微积分、概率论 | PyTorch 深度学习实战
前一篇文章,使用线性回归模型逼近目标模型 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于 强化学习必修课:引领人工智能新时代【梗直哥瞿炜】 线性代数、微积分、概率论 …...

9.PPT:儿童孤独症介绍【22】
目录 NO12345 NO6789 NO12345 1-3张素材.txt中的大纲→素材文档PPT.pptx设计→主题→积分字体:幻灯片母版在幻灯片母版右上角的相同位置插入任一剪贴画,改变该剪贴画的图片样式、为其重新着色,并使其不遮挡其他文本或对象 开始→版式动画…...

离散浣熊优化算法(DCOA)求解大规模旅行商问题(Large-Scale Traveling Salesman Problem,LTSP),MATLAB代码
大规模旅行商问题(Large-Scale Traveling Salesman Problem,LTSP)是经典旅行商问题(TSP)在规模上的扩展,是一个具有重要理论和实际意义的组合优化问题: 一、问题定义 给定一组城市和它们之间的…...
Java 引入和使用jcharset,支持UTF-7字符集
一、背景说明 Java标准库不直接支持UTF-7字符集,但通过我们可以使用第三方库jcharset方便地处理UTF-7编码的数据。 二、引入说明 JDK8及以下版本,我们将jcharset.jar并将其放到${JAVA_HOME}/jre/lib/ext/下即可完成引入。 JDK17及以后版本,对…...
rust安装笔记
安装笔记 安装加速cargo 国内源nightly版本安装其他目标将现有项目迁移到新版本升级 安装加速 export RUSTUP_UPDATE_ROOT"https://mirrors.ustc.edu.cn/rust-static/rustup" export RUSTUP_DIST_SERVERhttps://mirrors.tuna.tsinghua.edu.cn/rustup curl --proto h…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

rm视觉学习1-自瞄部分
首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...