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