论事件驱动架构 原文

返回主题详情 背诵模式

原文文件:论事件驱动架构-线上商品交易与运营平台.md

# 论事件驱动架构

## 摘要

2024 年 3 月,我参与了某互联网公司线上商品交易与运营平台的建设工作。该平台围绕公司线上交易业务的统一运营需要,实现了商品交易、库存协同和经营分析等工作的集中支撑。在该项目中,我担任系统架构设计师,主要负责总体架构设计、关键技术选型、模块划分、接口规范制定和核心方案评审工作。本文以该系统为例,主要论述事件驱动架构在项目中的具体应用。结合本项目交易链路集中、业务状态变化频繁、活动高峰请求量较大和外部处理结果存在延迟等特点,我们主要采用了事件识别、消息队列协作和幂等补偿处理等措施。实践证明,上述措施较好地降低了模块之间的耦合度,提高了交易链路的抗峰值能力和异常恢复能力,保证了项目顺利上线运行。

## 正文

随着公司线上经营规模不断扩大,业务活动从单一的商品展示和订单处理,逐步延伸到活动运营、库存协同、售后服务和经营分析等多个环节,各项业务对信息系统连续、稳定支撑的要求也越来越高。该项目建设前,公司线上交易业务主要依靠原有单体系统和若干后台工具支撑,虽然能够满足早期业务需要,但随着活动数量、用户访问量和订单处理量持续增加,原系统在业务协同和运行效率方面逐渐难以适应发展要求。特别是在活动高峰期,交易请求集中到达,订单生成、支付确认、库存处理和状态查询等环节相互依赖,容易出现响应延迟和状态不一致的情况;运营人员也需要在多个后台之间反复核对活动配置和交易数据,影响了业务处理效率。为了提高线上交易处理效率,规范商品和订单管理流程,降低后续系统维护成本,公司决定建设统一的线上商品交易与运营平台。

本项目于 2024 年 3 月启动,历时 10 个月完成核心功能建设并上线运行,项目组共 21 人。系统采用前后端分离方式建设,服务端以 Java 技术体系为主,并结合网关、缓存、数据库、消息队列和定时任务等技术组件完成系统支撑。平台上线后,用户侧交易流程由统一入口承载,运营人员也可以通过后台集中维护商品活动信息,并统一监控交易和对账情况。我在项目中担任系统架构设计师,主要负责总体架构设计、关键技术选型、模块划分、接口规范制定和核心方案评审,历时 4 个月完成主要架构设计工作。结合该平台交易状态变化快、模块协作多和高峰流量明显的特点,我在架构设计中重点采用了事件驱动架构思想。

在架构设计工作开始阶段,我认识到,事件驱动架构是进行系统协作设计和高并发业务处理时需要重点考虑的内容。事件驱动架构以事件作为系统状态变化和构件协作的触发点,构件之间不直接依赖固定调用链,而是通过事件发布、传递和订阅完成松耦合协作。常见的事件驱动架构相关方法包括事件识别、事件发布、事件订阅、消息队列和异常补偿等。本项目主要采用了事件识别、消息队列协作和幂等补偿处理。其中,事件识别用于确定哪些业务状态变化需要触发后续动作;消息队列协作用于实现事件可靠传递、异步处理和削峰填谷;幂等补偿处理用于在事件重复、延迟或失败时保证业务结果可追溯、可恢复。以下正文将重点描述这些措施的实施过程和应用效果。

在交易流程建模方面,我们采用事件识别来满足订单状态变化频繁、模块协作关系清晰的要求。原有系统更多依靠同步调用组织业务流程,订单、库存、支付和通知逻辑相互穿插,如果继续沿用这种方式,一旦支付结果延迟或库存处理变慢,就容易影响用户主流程,后续排查状态变化原因也比较困难。为解决这一问题,我组织项目组从业务状态变化角度梳理关键事件,将订单创建、支付确认、库存处理、订单关闭和退款完成等定义为主要业务事件,并明确每类事件的触发条件、订阅范围和必要业务摘要。具体实现时,我们要求事件内容只携带订单标识、用户标识、业务状态和处理时间等关键信息,详细业务数据仍由相关模块按需查询,避免事件内容过重。以用户提交订单为例,订单模块完成必要校验和订单记录后,即形成订单创建事件,库存和消息通知等后续处理不再全部阻塞用户请求。通过事件识别,系统协作从直接调用转为状态变化驱动,交易流程的关键节点更加清晰,也便于后续对订单状态进行追踪和分析。

在模块异步协作方面,我们采用 RocketMQ 作为消息队列连接件来满足活动高峰削峰和服务解耦的要求。线上商品活动具有明显的峰值特征,如果订单创建后同步等待库存处理、支付状态更新、消息通知和运营统计全部完成,用户下单响应时间会明显增加,某一模块处理变慢还可能影响整个交易链路。为解决这一问题,我们通过消息队列发布和订阅业务事件,使各模块围绕事件进行异步协作。具体做法是,订单、支付等模块在完成自身核心处理后发布业务事件,库存、消息、对账和报表等模块按照职责订阅并处理;Redis 用于支撑热点库存和幂等标识,MySQL 保存最终交易和状态数据。以支付确认场景为例,支付结果返回后,系统通过消息队列通知订单状态更新、用户消息提醒和运营统计处理,各模块按自身节奏完成工作。通过这种消息队列协作方式,核心交易请求不再等待所有后续动作完成,既降低了模块之间的耦合度,又能在活动高峰期平滑处理突发流量,提高了系统整体稳定性。

在异常恢复和结果保障方面,我们采用幂等补偿处理来满足事件驱动场景下业务结果可靠的要求。事件驱动架构虽然降低了同步调用压力,但也会带来消息重复投递、延迟到达、消费失败和处理结果不一致等问题。如果缺少控制机制,就可能出现库存重复扣减、订单状态异常或消息重复发送等情况。为解决这一问题,我们在关键消费模块中设计了幂等判断和补偿机制。具体实现时,系统以订单号、支付流水号和业务操作号作为幂等依据,对已经处理过的事件直接返回处理结果;对短时失败的消息由消息队列进行重试,对长时间未完成的业务由 xxl-job 定时扫描并触发补偿处理,同时保留接口日志和处理状态供客服与运维人员核查。以未支付订单关闭为例,定时任务发现订单超过支付时限后触发关闭处理,库存模块收到相关通知后释放占用库存,若释放失败则记录异常并继续补偿。通过这种幂等补偿处理,事件驱动架构在保持异步解耦优势的同时,也保证了交易结果可追溯、可恢复。

整个项目于 2025 年 1 月完成核心功能上线,并在公司主要业务线推广使用。系统上线后,先后支撑了多次业务活动和交易高峰,整体运行情况较为平稳,核心业务流程能够正常开展,运营和客服人员也能够通过统一平台完成日常处理工作。上线运行期间,系统未发生重大生产事故,少量异常数据能够通过补偿任务和人工复核及时处理,维护工作量处于可控范围。经过一段时间运行,该平台基本满足了公司线上交易和运营管理的需要,提高了业务处理效率,减少了运营人员的重复操作,并得到了业务部门的认可。实践证明,事件驱动架构对于本项目中交易链路解耦、高峰流量缓冲和异常恢复处理起到了较好的支撑作用。

在总结项目经验的同时,我也看到本项目仍然存在一些不足。第一,活动高峰期部分热门商品访问较为集中,个别页面和查询接口在峰值情况下响应时间仍有波动;第二,事件链路引入异步处理后,对消息追踪、异常定位和运营报表口径提出了更高要求,部分异常订单仍需要人工复核。针对第一类问题,后续我们计划继续优化热点数据缓存、查询索引和资源扩容策略;针对第二类问题,我们将进一步完善事件链路监控、消息补偿规则和报表统计口径,减少人工核对工作。通过本项目实践,我认识到,事件驱动架构不是简单地引入消息队列,而是要围绕业务事件识别、事件可靠传递和异常恢复机制进行整体设计。只有结合具体业务流程和质量属性要求合理使用事件驱动思想,才能使系统在高并发和复杂协作场景下长期稳定地支撑业务发展。