事件驱动架构(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…...
从零构建可定制对话系统:模块化架构与RAG实战指南
1. 项目概述:从零构建一个可定制的对话系统最近在折腾一个挺有意思的东西,我把它叫做“定制化聊天系统”。起因很简单,市面上现成的聊天机器人,无论是开源的还是商业的,总感觉差了那么点意思。要么是功能太臃肿&#x…...
CircuitPython状态灯、安全模式与文件系统故障排查实战指南
1. 项目概述与核心价值 如果你正在用CircuitPython做项目,无论是物联网传感器节点、智能穿戴设备还是互动艺术装置,大概率都遇到过这样的瞬间:板子上的RGB状态灯突然开始闪烁诡异的颜色,或者电脑上那个熟悉的 CIRCUITPY U盘图标…...
量化交易强化学习环境TradingGym:从Gym接口到实战策略训练
1. 项目概述:一个为量化交易策略量身定制的强化学习训练场如果你正在尝试将强化学习(Reinforcement Learning, RL)应用到股票、期货或加密货币的量化交易中,大概率会遇到一个共同的困境:环境太难搭了。市面上的回测框架…...
像素艺术家紧急预警:Midjourney即将关闭--tile参数兼容性(倒计时14天),现在必须掌握的3种替代渲染方案
更多请点击: https://intelliparadigm.com 第一章:像素艺术家紧急预警:Midjourney即将关闭--tile参数兼容性(倒计时14天) Midjourney v6.5 已正式宣布将于 14 天后终止对 --tile 参数的原生支持,此举将直…...
保姆级教程:INCA 7.2.3 从新建工程到观测标定的完整流程(附A2L文件处理技巧)
INCA 7.2.3 全流程实战指南:从工程搭建到参数标定的深度解析 在汽车电子开发领域,标定工具链的掌握程度直接影响开发效率。作为行业标准的INCA软件,其7.2.3版本在工程管理、实时观测和参数标定方面提供了更完善的解决方案。本文将采用"操…...
Windows鼠标指针主题定制:从.cur/.ani文件到个性化交互体验
1. 项目概述:一个为Windows终端注入灵魂的鼠标指针主题如果你和我一样,每天有超过8小时的时间是与Windows操作系统相伴的,那么你对那个千篇一律的白色箭头鼠标指针,恐怕早已感到审美疲劳。它就像一个沉默的、功能性的背景板&#…...
Git安全增强实战:使用Ante实现策略即代码的版本控制防护
1. 项目概述:一个为开发者打造的“代码保险箱”如果你和我一样,在职业生涯中经历过几次“代码灾难”——比如不小心git push -f覆盖了同事的提交,或者手滑rm -rf删除了一个正在开发中的功能分支——那你一定会对“代码安全”这四个字有切肤之…...
未来之窗昭和仙君(九十四)用户指引自助教学源码—东方仙盟
软件教学引导功能说明书未来之窗昭和仙君 - cyberwin_fairyalliance_webquery一、功能概述软件教学引导功能主要用于为用户提供软件操作的引导,通过一系列步骤逐步引导用户完成软件的重要操作。该功能会创建遮罩层、高亮框和提示框,引导用户点击特定元素…...
KMS智能激活终极指南:如何一键永久激活Windows和Office
KMS智能激活终极指南:如何一键永久激活Windows和Office 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活烦恼吗?每次重装系统后都要重新激活Office&…...
ARM处理器仿真技术:Cortex-R52与Neoverse实战解析
1. ARM处理器仿真技术概述在现代芯片设计和软件开发流程中,处理器仿真模型已成为不可或缺的关键工具。作为Arm生态系统的重要组成部分,Iris仿真组件提供了对Cortex-R52和Neoverse系列处理器的精确模拟能力。这些模型不仅能够模拟指令执行流程,…...
