事件驱动架构EDA与事件中心完整知识梳理

发布时间:2026/11/5 11:24:55

事件驱动架构EDA与事件中心完整知识梳理 事件驱动架构EDA与事件中心完整知识梳理一、什么是事件概念事件Event是系统中发生的一个事实的描述。它表示某件事已经发生了而不是请你做某件事。对比项命令Command事件Event语义“请你做XX”“XX已经发生了”方向发送方知道接收方发送方不关心谁订阅耦合度强耦合松耦合示例createOrder(orderDto)OrderCreatedEvent时态祈使句/将来时过去时事件的三要素{type:order.created,// 事件类型发生了什么source:order-service,// 事件来源谁产生的data:{orderId:123},// 事件数据具体内容time:2026-07-14T10:28:00Z// 事件时间什么时候发生的}注博客https://blog.csdn.net/badao_liumang_qizhi二、事件驱动架构EDA核心模型┌──────────┐ ┌──────────────┐ ┌──────────┐ │ 生产者 │ 发布事件 │ 事件中心 │ 推送事件 │ 消费者 │ │ Producer │ ────────→ │ Event Broker │ ────────→ │ Consumer │ └──────────┘ └──────────────┘ └──────────┘ │ │ 推送事件 ▼ ┌──────────┐ │ 消费者 B │ └──────────┘与传统同步调用对比同步调用点对点a服务 ──HTTP POST──→ b服务 ←──Response────问题b 挂了a 的业务也跟着失败。事件驱动发布/订阅a服务 ──发布事件──→ 事件中心 ──推送──→ b服务 ──推送──→ 监控服务 ──推送──→ 日志服务优势b挂了不影响 a将来新增消费者无需改 a 代码。适用场景系统间异步通知不需要同步等待结果一个事件需要通知多个下游系统生产者和消费者由不同团队维护需要解耦上下游系统的部署和发布周期三、CloudEvents 规范CloudEvents 是 CNCF云原生计算基金会定义的事件格式标准目的是让不同系统产生的事件有统一的格式。核心属性属性含义示例specversion规范版本1.0type事件类型aaa.xxxsource事件来源/bbb-serviceid事件唯一IDuuidtime事件产生时间2026-07-14T10:28:00Zdata事件负载业务数据JSON 对象HTTP 协议绑定CloudEvents 通过 HTTP Header 传递元信息POST /event-center/api/v3/eventTypes/aaa.xxx/send Content-Type: application/json Ce-Type: aaa.xxx Ce-Specversion: 1.0 Authorization: Bearer token { fulfillmentCode: xx.20260714.000005.xx, event: ttt, eventDate: 2026-07-14 10:28:00, systemName: uuu }四、事件中心的角色事件中心Event Center/Event Broker是事件流转的中间枢纽┌─────────────────────────────────────────────────────────┐ │ 事件中心 │ │ │ │ ┌────────────┐ ┌────────────┐ ┌────────────────┐ │ │ │ 事件接收 │ │ 事件路由 │ │ 事件投递 │ │ │ │ (Ingress) │→ │ (Routing) │→ │ (Delivery) │ │ │ └────────────┘ └────────────┘ └────────────────┘ │ │ │ │ 职责 │ │ 1. 接收生产者发布的事件 │ │ 2. 根据 eventType 路由到对应订阅者 │ │ 3. 可靠投递重试、死信队列 │ │ 4. 认证鉴权 │ └─────────────────────────────────────────────────────────┘与 MQ 的区别对比项MQRabbitMQ/Kafka事件中心范围同一系统/团队内部跨系统/跨团队/跨公司协议AMQP/Kafka协议HTTPCloudEvents订阅方式消费者主动拉取事件中心主动推送Webhook运维方自己运维平台方统一运维格式自定义标准化CloudEvents五、通用代码示例1. 事件发布工具类/** * 事件中心推送工具类. * 基于 CloudEvents 规范通过 HTTP POST 推送事件到事件中心. */ComponentSlf4jpublicclassEventPublisher{Value(${event-center.token})privateStringtoken;privatefinalRestTemplaterestTemplate;publicEventPublisher(RestTemplaterestTemplate){this.restTemplaterestTemplate;}/** * 发布事件到事件中心. * * param eventType 事件类型如 order.created * param url 事件中心接收地址 * param payload 事件数据JSON 字符串 * return 推送结果 */publicEventResultpublish(StringeventType,Stringurl,Stringpayload){try{HttpHeadersheadersnewHttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);headers.set(Authorization,token);headers.set(Ce-Type,eventType);headers.set(Ce-Specversion,1.0);HttpEntityStringrequestnewHttpEntity(payload,headers);ResponseEntityStringresponserestTemplate.postForEntity(url,request,String.class);log.info(事件发布成功, type{}, response{},eventType,response.getBody());returnEventResult.success(response.getBody());}catch(Exceptione){log.warn(事件发布失败, type{},eventType,e);returnEventResult.fail(e.getMessage());}}}2. 本地消息表 可靠发布/** * 可靠事件发布服务. * 先写本地消息表事务提交后再触发实际推送. */ServicepublicclassReliableEventPublisher{ResourceprivateEventLogRepositoryeventLogRepository;ResourceprivateEventMqSendereventMqSender;/** * 记录待发布事件在业务事务内调用. */TransactionalpublicvoidprepareEvent(StringeventType,Stringpayload,StringbizKey){// 1. 写入本地消息表EventLogeventLognewEventLog();eventLog.setEventType(eventType);eventLog.setPayload(payload);eventLog.setBizKey(bizKey);eventLog.setStatus(0);// 待发送eventLog.setRetryCount(0);eventLogRepository.save(eventLog);// 2. 注册事务提交后的回调发送 MQAfterTransactionActionCollectorcollectornewAfterTransactionActionCollector();TransactionSynchronizationManager.registerSynchronization(collector);collector.addCommitSyncAction(()-eventMqSender.send(eventLog.getId()));}}3. MQ 消费者 实际推送/** * 事件推送 MQ 消费者. * 消费本地消息表 ID执行实际推送. */ComponentSlf4jpublicclassEventPublishConsumer{ResourceprivateEventLogRepositoryeventLogRepository;ResourceprivateEventPublishereventPublisher;RabbitListener(queues${event.publish.queue})publicvoidconsume(IntegereventLogId){EventLogeventLogeventLogRepository.findById(eventLogId).orElse(null);if(eventLognull){return;}// 已成功的跳过if(eventLog.getStatus()1){return;}// 推送事件中心StringurlresolveUrl(eventLog.getEventType());EventResultresulteventPublisher.publish(eventLog.getEventType(),url,eventLog.getPayload());// 更新状态if(result.isSuccess()){eventLog.setStatus(1);eventLog.setResponse(result.getBody());}else{eventLog.setStatus(2);eventLog.setErrorMsg(result.getErrorMsg());}eventLog.setRetryCount(eventLog.getRetryCount()1);eventLogRepository.save(eventLog);}}4. 事务同步回调机制/** * Spring 事务同步回调示例. * 确保 MQ 消息在事务提交后才发送. */publicclassTransactionCallbackDemo{publicvoidbusinessMethod(){// ... 业务逻辑操作数据库 ...// 注册事务提交后的回调TransactionSynchronizationManager.registerSynchronization(newTransactionSynchronization(){OverridepublicvoidafterCommit(){// 事务提交成功后执行mqSender.send(message);}});}}5. 运维重推接口/** * 运维重推接口. * 用于手动触发失败事件的重新发布. */RestControllerRequestMapping(/api/inner/event)publicclassEventRetryController{ResourceprivateEventMqSendereventMqSender;ResourceprivateEventLogRepositoryeventLogRepository;PostMapping(/retry)publicResultBooleanretry(RequestBodyListIntegerlogIds){if(logIdsnull||logIds.isEmpty()){// 未指定ID则查询所有失败记录ListEventLogfailedLogseventLogRepository.findByStatusInAndRetryCountLessThan(Arrays.asList(0,2),6);logIdsfailedLogs.stream().map(EventLog::getId).collect(Collectors.toList());}logIds.forEach(eventMqSender::send);returnResult.success(true);}}六、完整数据流示意┌─ 你的服务内部 ─────────────────────────────┐ │ │ 业务代码 │ ① 写入本地消息表status0 │ │ │ ② 注册事务回调 │ ▼ │ │ │ 事务提交 ───────────│─────────┼────────────────────────────────────│ │ ▼ │ │ ③ 回调触发发送 MQ消息logId │ │ │ │ │ ▼ │ │ ④ MQ 消费者读取消息表 → 组装 HTTP 请求 │ │ │ │ └─────────┼────────────────────────────────────┘ │ ▼ HTTP POSTCloudEvents 格式 ┌─────────────────────┐ │ 事件中心 │ │ 接收 → 路由 → 投递 │ └─────────┬───────────┘ │ Webhook 推送 ▼ ┌─────────────────────┐ │ b 服务 │ │ 接收事件 → 处理业务 │ └─────────────────────┘七、核心概念速查表概念一句话解释事件Event已发生事实的描述过去时事件类型Event Type事件的分类标识用于路由事件中心Event Broker负责接收、路由、投递事件的中间平台生产者Producer发布事件的服务消费者Consumer/Subscriber订阅并处理事件的服务CloudEventsCNCF 定义的事件格式标准本地消息表Outbox确保事件可靠发布的数据库表事务同步Transaction Sync确保消息在事务提交后才发送最终一致性允许短暂不一致但最终状态一致幂等性同一事件重复投递不会产生副作用
延伸阅读

更多相关文章

2026/11/5 10:39:47

JBoltAI V5.0核心能力解析

作为向量空间JBoltAI推出的Java生态企业级AI开发框架,JBoltAI V5.0版本围绕两大核心方向完成了深度重构,进一步完善企业AI应用落地的基础设施能力。本体语义:让AI真正理解企业业务向量空间JBoltAI在V5.0版本中搭建的本体语义能力,…

2026/11/1 22:24:35

计算机毕业设计之jsp校医院预约挂号平台的设计与实现

随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&#xf…

2026/11/5 11:24:07

Makefile自动化构建:从原理到实战技巧

1. 从零开始理解Makefile的本质 作为一个在Linux环境下摸爬滚打多年的老码农,我见过太多新手面对Makefile时露出的困惑表情。Makefile本质上是一个自动化构建脚本,但它更像是一种"构建逻辑的声明式表达"。想象你是个建筑工头,Makef…

2026/11/5 11:24:07

可跑通的ADS射频仿真实例:S参数、匹配与功放谐波平衡

简介:面向射频与微波电路设计学习者的 ADS 仿真实例合集,围绕阻抗匹配、滤波器、低噪放、功分器、功率放大器与耦合器等典型模块展开,适合希望从原理走向电路建模、仿真与优化的初中级工程师及电子类专业学生查练。压缩包为 rar 格式&#xf…

2026/11/5 11:24:07

存储过程参数过多错误分析与解决方案

1. 问题现象与背景分析 最近在排查一个生产环境数据库问题时,遇到了"CDataBaseEngineSink::OnRequsetInsertCreateRecord 数据库异常:为过程或函数 GSP_GR_InsertCreateRecord 指定了过多的参数"的错误。这个错误发生在调用存储过程GSP_GR_Ins…

2026/11/5 11:24:07

RabbitMQ消息投递可靠性保障与补偿机制实战

1. 消息队列中的投递可靠性难题 在分布式系统架构中,RabbitMQ作为经典的消息中间件,其消息投递的可靠性直接影响着业务系统的稳定性。我经历过一个电商订单系统案例:促销高峰期每秒3000订单消息通过RabbitMQ流转,有0.3%的消息神秘…

2026/11/5 11:24:06

SIL2认证的本质:从IEC 61508到ControlLogix硬件诊断的确定性实现

简介:本资源为罗克韦尔自动化(Rockwell Automation)ControlLogix系列PLC于2021年通过IEC 61508:2010标准SIL2功能安全认证的官方技术文档,面向工业自动化工程师、安全系统设计人员及PLC应用开发者,解决安全回路设计中对…

2026/11/5 11:19:06

H5游戏图集拆解实战:plist/atlas解析与Python还原脚本

简介:面向Cocos、白鹭(Egret)与Laya等2D游戏引擎开发者的图集/合图分解实用工具,用于将精灵表按plist元数据还原为单张图片,便于资源编辑、版本更新与多设备适配。压缩包共6个文件、约227KB,以可执行程序为…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑