论事件驱动架构

题源类型未标注
年份/批次
适用项目某互联网公司线上商品交易与运营平台
主题概念事件驱动架构以事件作为系统状态变化和构件协作的触发点,构件之间不直接依赖固定调用链,而是通过事件发布、传递和订阅完成松耦合协作
常见方法事件识别、事件发布、事件订阅、消息队列和异常补偿等
已选论文点事件识别 / 消息队列协作 / 幂等补偿处理
编辑主题 查看原文
普通模式

论文点

新建论文点
事件识别 排序:1 普通模式
项目位置/技术/需求
在交易流程建模方面,我们采用事件识别来满足订单状态变化频繁、模块协作关系清晰的要求
解决的问题
原有系统更多依靠同步调用组织业务流程,订单、库存、支付和通知逻辑相互穿插,如果继续沿用这种方式,一旦支付结果延迟或库存处理变慢,就容易影响用户主流程,后续排查状态变化原因也比较困难
解决的方法
为解决这一问题,我组织项目组从业务状态变化角度梳理关键事件,将订单创建、支付确认、库存处理、订单关闭和退款完成等定义为主要业务事件,并明确每类事件的触发条件、订阅范围和必要业务摘要
具体的实现
具体实现时,我们要求事件内容只携带订单标识、用户标识、业务状态和处理时间等关键信息,详细业务数据仍由相关模块按需查询,避免事件内容过重
例子
以用户提交订单为例,订单模块完成必要校验和订单记录后,即形成订单创建事件,库存和消息通知等后续处理不再全部阻塞用户请求
效果
通过事件识别,系统协作从直接调用转为状态变化驱动,交易流程的关键节点更加清晰,也便于后续对订单状态进行追踪和分析
消息队列协作 排序:2 普通模式
项目位置/技术/需求
在模块异步协作方面,我们采用 RocketMQ 作为消息队列连接件来满足活动高峰削峰和服务解耦的要求
解决的问题
线上商品活动具有明显的峰值特征,如果订单创建后同步等待库存处理、支付状态更新、消息通知和运营统计全部完成,用户下单响应时间会明显增加,某一模块处理变慢还可能影响整个交易链路
解决的方法
为解决这一问题,我们通过消息队列发布和订阅业务事件,使各模块围绕事件进行异步协作
具体的实现
具体做法是,订单、支付等模块在完成自身核心处理后发布业务事件,库存、消息、对账和报表等模块按照职责订阅并处理;Redis 用于支撑热点库存和幂等标识,MySQL 保存最终交易和状态数据
例子
以支付确认场景为例,支付结果返回后,系统通过消息队列通知订单状态更新、用户消息提醒和运营统计处理,各模块按自身节奏完成工作
效果
通过这种消息队列协作方式,核心交易请求不再等待所有后续动作完成,既降低了模块之间的耦合度,又能在活动高峰期平滑处理突发流量,提高了系统整体稳定性
幂等补偿处理 排序:3 普通模式
项目位置/技术/需求
在异常恢复和结果保障方面,我们采用幂等补偿处理来满足事件驱动场景下业务结果可靠的要求
解决的问题
如果缺少控制机制,就可能出现库存重复扣减、订单状态异常或消息重复发送等情况
解决的方法
为解决这一问题,我们在关键消费模块中设计了幂等判断和补偿机制
具体的实现
具体实现时,系统以订单号、支付流水号和业务操作号作为幂等依据,对已经处理过的事件直接返回处理结果;对短时失败的消息由消息队列进行重试,对长时间未完成的业务由 xxl-job 定时扫描并触发补偿处理,同时保留接口日志和处理状态供客服与运维人员核查
例子
以未支付订单关闭为例,定时任务发现订单超过支付时限后触发关闭处理,库存模块收到相关通知后释放占用库存,若释放失败则记录异常并继续补偿
效果
通过这种幂等补偿处理,事件驱动架构在保持异步解耦优势的同时,也保证了交易结果可追溯、可恢复