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

发布时间:2026/7/15 0:38:15

事件驱动架构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确保消息在事务提交后才发送最终一致性允许短暂不一致但最终状态一致幂等性同一事件重复投递不会产生副作用

相关新闻

【限时解密】ChatGPT私域社群GMV提升217%的底层逻辑:基于27个真实社群的NLP情感分析报告

【限时解密】ChatGPT私域社群GMV提升217%的底层逻辑:基于27个真实社群的NLP情感分析报告

2026/7/15 0:28:14

更多请点击: https://codechina.net 第一章:【限时解密】ChatGPT私域社群GMV提升217%的底层逻辑:基于27个真实社群的NLP情感分析报告 通过对27个垂直行业(教育、SaaS、跨境电商、知识付费等)的活跃ChatGPT私域社群进行…

Copilot团队管理功能落地全图谱(从权限配置到效能看板):微软内部PM未公开的7条黄金规则

Copilot团队管理功能落地全图谱(从权限配置到效能看板):微软内部PM未公开的7条黄金规则

2026/7/15 0:28:14

更多请点击: https://codechina.net 第一章:Copilot团队管理功能全景概览 GitHub Copilot 的团队管理功能为组织级开发协作提供了统一策略配置、成员权限控制与使用洞察分析能力,覆盖从开发者准入到资源配额分配的全生命周期管理。该功能依托…

计算机考试-n叉树节点度易混淆—东方仙盟

计算机考试-n叉树节点度易混淆—东方仙盟

2026/7/15 0:28:14

n0​:度 0,叶子节点(无孩子)n1​:度 1,只有左孩子 或 只有右孩子n2​:度 2,同时有左、右孩子公式 1(总节点)Nn0​n1​n2​公式 2(重中之重&#x…

iOS ijkplayer进阶:源码编译、RTSP/HTTPS协议支持与录制功能集成实战

iOS ijkplayer进阶:源码编译、RTSP/HTTPS协议支持与录制功能集成实战

2026/7/15 1:58:19

1. ijkplayer源码编译与环境准备第一次接触ijkplayer的开发者可能会被它的编译过程吓到,但其实只要掌握几个关键步骤,整个过程就像搭积木一样简单。我最近在开发一款安防监控App时,就经历了从零开始编译ijkplayer的全过程,这里把踩…

高效工具选择指南:从需求分析到落地实践

高效工具选择指南:从需求分析到落地实践

2026/7/15 1:58:19

这类标题经常出现在工具推荐或效率提升的场景里,但光看标题很难判断具体指的是哪个软件、解决什么问题。我一般会先拆解这类推荐背后的核心需求:它通常指向一个能显著提升工作效率、解决特定痛点或带来意外便利的工具。更值得关注的不是“伟大发现”这个…

【网络实战】思科综合实验:跨自治系统互联与动态路由协议融合

【网络实战】思科综合实验:跨自治系统互联与动态路由协议融合

2026/7/15 1:58:19

1. 实验环境搭建与需求分析这个实验模拟了一个典型的企业网络扩展场景,包含两个独立的自治系统(AS)。自治系统A采用RIPv2作为内部网关协议,自治系统B则运行OSPF协议。两个AS需要通过边界路由器实现互联,并最终让所有局…

新特性:Scroll 滚动特效 —— 实现「回弹」与「摩擦」物理效果

新特性:Scroll 滚动特效 —— 实现「回弹」与「摩擦」物理效果

2026/7/15 1:58:19

文章目录前言一、滚动物理模型:回弹与摩擦1.1 真实世界的类比1.2 系统默认值差异二、edgeEffect:三种边缘效果详解2.1 EdgeEffect 枚举2.2 Spring —— 越界拖拽 松手回弹2.3 Fade —— 边缘渐隐2.4 None —— 硬截止2.5 EdgeEffectOptions:…

基于SpringBoot的个人博客系统【从零到一实战部署指南】

基于SpringBoot的个人博客系统【从零到一实战部署指南】

2026/7/15 1:58:19

1. 为什么选择SpringBoot开发个人博客第一次接触SpringBoot是在2016年,当时就被它"约定优于配置"的理念深深吸引。相比传统的SSH框架,SpringBoot让Java Web开发变得前所未有的简单。就拿搭建个人博客来说,以前需要配置各种XML文件&…

pandas多维聚合实战:银行级生产环境聚合模式详解

pandas多维聚合实战:银行级生产环境聚合模式详解

2026/7/15 1:48:18

1. 项目概述:为什么多维聚合不是“加个groupby”就能搞定的事我在银行风控部门做过三年数据管道开发,后来跳槽到一家头部支付机构做BI平台架构。这期间最常被业务方拍着桌子问的一句话是:“上个月华东区餐饮类商户的交易金额中位数、手续费波…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/14 10:03:09

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/13 20:43:19

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/15 0:26:43

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

【LINUX】驱动

【LINUX】驱动

2026/7/15 0:08:14

【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】

【1982-2026】全国高精度建筑轮廓|村级精度|SHP矢量

【1982-2026】全国高精度建筑轮廓|村级精度|SHP矢量

2026/7/15 0:08:14

🔍 数据简介 本次分享1982-2026年全国村级精度建筑轮廓矢量数据,覆盖全国各省市区县,到村级别精细,为2026年最新实时采集成果,非网传仅60/77个城市的老旧数据。 数据含带高度/不带高度双版本,单体建筑边界精…

【1975-2026】全国水系水路数据|河流/水库/运河|SHP矢量

【1975-2026】全国水系水路数据|河流/水库/运河|SHP矢量

2026/7/15 0:08:14

🔍 数据简介 本次分享1975-2026年全国高精度水系水路矢量数据,覆盖全国全域,包含河流、水系、水库、运河、湿地、冰川、沟渠等全类别水文要素。 数据集包含双层矢量图层,字段分类清晰、要素齐全,支持2013-2026逐年完整…