外卖霸王餐API故障演练:Java团队基于Chaos Monkey模拟“Redis集群宕机”“数据库主从延迟”场景的应急恢复预案验证
外卖霸王餐API故障演练Java团队基于Chaos Monkey模拟“Redis集群宕机”“数据库主从延迟”场景的应急恢复预案验证背景为什么外卖霸王餐API需要故障演练作为外卖霸王餐API唯一供给源头同时也是霸王餐外卖CPS取链源头俱美开放平台承载着海量高并发的请求。在“霸王餐”活动期间瞬时流量可能激增数十倍任何基础设施的微小故障都可能被放大导致服务雪崩。传统的测试只能验证功能正确性无法暴露系统在极端情况下的脆弱性。因此我们引入了混沌工程Chaos Engineering理念通过主动注入故障来验证系统的弹性和应急预案的有效性。技术选型为什么是Chaos MonkeyChaos Monkey是Netflix开源的混沌工程工具它能随机终止生产环境中的实例迫使工程师构建更具弹性的服务。在我们的Java技术栈中我们使用了其JVM层面的实现——chaos-monkey-spring-boot它能无侵入地对我们的Spring Boot应用进行故障注入。演练场景一模拟Redis集群宕机Redis作为我们的核心缓存存储着用户会话、活动配置和热点数据。一旦Redis集群宕机所有请求将直接穿透到数据库后果不堪设想。1. 引入Chaos Monkey依赖!-- pom.xml --dependencygroupIdde.codecentric/groupIdartifactIdchaos-monkey-spring-boot/artifactIdversion2.5.0/version/dependency2. 配置Chaos Monkey# application.ymlchaos:monkey:enabled:truewatcher:repository:true# 开启对Repository层的监控rest-controller:true# 开启对Controller层的监控assaults:level:5# 攻击等级1-10latency-active:true# 开启延迟攻击latency-range-start:5000# 延迟5秒latency-range-end:10000exception-active:true# 开启异常攻击exceptions:-java.net.ConnectException# 模拟连接异常3. 编写业务代码与降级策略我们的业务代码需要能够优雅地处理Redis不可用的情况。packagebaodanbao.com.cn.service;importbaodanbao.com.cn.model.Activity;importbaodanbao.com.cn.repository.ActivityRepository;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.cache.annotation.Cacheable;importorg.springframework.dao.DataAccessException;importorg.springframework.data.redis.connection.RedisConnection;importorg.springframework.data.redis.core.RedisCallback;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.stereotype.Service;/** * 活动服务 * author baodanbao.com.cn */ServicepublicclassActivityService{AutowiredprivateActivityRepositoryactivityRepository;AutowiredprivateRedisTemplateString,ObjectredisTemplate;/** * 获取活动详情带缓存 * param activityId 活动ID * return 活动信息 */Cacheable(valueactivity,key#activityId)publicActivitygetActivityDetail(LongactivityId){// 模拟从数据库查询returnactivityRepository.findById(activityId).orElse(null);}/** * 模拟Redis宕机时的降级查询 * param activityId 活动ID * return 活动信息 */publicActivitygetActivityWithFallback(LongactivityId){try{// 尝试访问Redis如果Redis宕机这里会抛出异常redisTemplate.execute((RedisCallbackObject)RedisConnection::ping);returngetActivityDetail(activityId);}catch(DataAccessExceptione){// Redis不可用执行降级策略直接查数据库System.out.println(Redis不可用执行降级策略直接查询数据库);returnactivityRepository.findById(activityId).orElse(null);}}}演练场景二模拟数据库主从延迟在外卖霸王餐业务中用户下单后需要立即查询订单状态。如果此时发生数据库主从延迟用户可能会看到“订单不存在”的错误提示体验极差。1. 配置读写分离首先我们需要配置主从数据源。packagebaodanbao.com.cn.config;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.boot.jdbc.DataSourceBuilder;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.Primary;importorg.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;importjavax.sql.DataSource;importjava.util.HashMap;importjava.util.Map;/** * 数据源配置 * author baodanbao.com.cn */ConfigurationpublicclassDataSourceConfig{Bean(namemasterDataSource)ConfigurationProperties(prefixspring.datasource.master)publicDataSourcemasterDataSource(){returnDataSourceBuilder.create().build();}Bean(nameslaveDataSource)ConfigurationProperties(prefixspring.datasource.slave)publicDataSourceslaveDataSource(){returnDataSourceBuilder.create().build();}BeanPrimarypublicDataSourceroutingDataSource(Qualifier(masterDataSource)DataSourcemasterDataSource,Qualifier(slaveDataSource)DataSourceslaveDataSource){DynamicDataSourcedynamicDataSourcenewDynamicDataSource();MapObject,ObjecttargetDataSourcesnewHashMap();targetDataSources.put(DataSourceType.MASTER,masterDataSource);targetDataSources.put(DataSourceType.SLAVE,slaveDataSource);dynamicDataSource.setTargetDataSources(targetDataSources);dynamicDataSource.setDefaultTargetDataSource(masterDataSource);// 默认使用主库returndynamicDataSource;}}/** * 动态数据源 * author baodanbao.com.cn */publicclassDynamicDataSourceextendsAbstractRoutingDataSource{OverrideprotectedObjectdetermineCurrentLookupKey(){returnDataSourceContextHolder.getDataSourceType();}}/** * 数据源上下文 * author baodanbao.com.cn */publicclassDataSourceContextHolder{privatestaticfinalThreadLocalDataSourceTypeCONTEXTnewThreadLocal();publicstaticvoidsetDataSourceType(DataSourceTypetype){CONTEXT.set(type);}publicstaticDataSourceTypegetDataSourceType(){returnCONTEXT.get();}publicstaticvoidclearDataSourceType(){CONTEXT.remove();}}/** * 数据源类型枚举 * author baodanbao.com.cn */publicenumDataSourceType{MASTER,SLAVE}2. 模拟主从延迟并验证我们通过Chaos Monkey在从库上注入延迟然后验证业务代码是否能正确处理。packagebaodanbao.com.cn.service;importbaodanbao.com.cn.config.DataSourceContextHolder;importbaodanbao.com.cn.config.DataSourceType;importbaodanbao.com.cn.model.Order;importbaodanbao.com.cn.repository.OrderRepository;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;/** * 订单服务 * author baodanbao.com.cn */ServicepublicclassOrderService{AutowiredprivateOrderRepositoryorderRepository;/** * 创建订单 * param order 订单对象 * return 创建的订单 */publicOrdercreateOrder(Orderorder){// 写操作强制使用主库DataSourceContextHolder.setDataSourceType(DataSourceType.MASTER);OrdersavedOrderorderRepository.save(order);DataSourceContextHolder.clearDataSourceType();returnsavedOrder;}/** * 查询订单模拟主从延迟场景 * param orderId 订单ID * return 订单信息 */publicOrdergetOrder(LongorderId){// 读操作默认使用从库DataSourceContextHolder.setDataSourceType(DataSourceType.SLAVE);OrderorderorderRepository.findById(orderId).orElse(null);// 如果从库查不到可能是主从延迟降级到主库查询if(ordernull){System.out.println(从库未查到订单可能为主从延迟降级查询主库);DataSourceContextHolder.setDataSourceType(DataSourceType.MASTER);orderorderRepository.findById(orderId).orElse(null);}DataSourceContextHolder.clearDataSourceType();returnorder;}}演练执行与结果分析启动应用启动我们的Spring Boot应用确保Chaos Monkey已生效。触发攻击通过Actuator端点POST /actuator/chaosmonkey/assaults触发异常攻击。观察日志Redis宕机日志中应出现“Redis不可用执行降级策略直接查询数据库”的打印且接口响应时间略有增加但服务未中断。数据库主从延迟日志中应出现“从库未查到订单可能为主从延迟降级查询主库”的打印最终能正确返回订单信息。验证监控检查Prometheus/Grafana监控面板确认在故障期间QPS、响应时间、错误率等指标在可接受范围内。通过以上演练我们验证了俱美开放平台在面对Redis宕机和数据库主从延迟等极端情况时具备完善的应急恢复预案和系统弹性能够保障外卖霸王餐API的稳定运行。本文著作权归 俱美开放平台 转载请注明出处

相关新闻

C++在线OJ负载均衡实战:从单体架构到高可用集群的设计与实现

C++在线OJ负载均衡实战:从单体架构到高可用集群的设计与实现

1. 项目概述:从单点崩溃到弹性服务的蜕变 做在线评测系统(Online Judge, OJ)的,谁没经历过半夜被流量打崩的噩梦?尤其是当学校搞个编程竞赛,或者某门课的实验DDL快到了,几百上千个学…

2026/7/28 19:08:04 阅读更多 →
从浏览器输入URL到页面显示——计算机网络原理解析

从浏览器输入URL到页面显示——计算机网络原理解析

本文以计算机网络课程知识为主线,结合Web开发中的实际场景(Tomcat、Servlet、Ajax、HTTP状态码等),深入浅出地讲解应用层、传输层、网络层、数据链路层及物理层的工作原理,并完整剖析DNS解析、IP/MAC寻址、路由与交换等…

2026/7/28 17:20:26 阅读更多 →
Sqribble:基于模板规则的云原生文档自动化操作系统

Sqribble:基于模板规则的云原生文档自动化操作系统

1. 项目概述:当“模板”成为文档生产的操作系统 我第一次用 Sqribble 是在帮一个做知识付费的朋友赶制一份《新手理财避坑指南》。他手上有三篇写得不错的公众号文章,但排版成 PDF 发给学员时,Word 导出的格式乱得像被猫抓过,自己…

2026/7/27 13:12:29 阅读更多 →

最新新闻

Steam成就管理器终极指南:5步掌握免费成就解锁技巧

Steam成就管理器终极指南:5步掌握免费成就解锁技巧

Steam成就管理器终极指南:5步掌握免费成就解锁技巧 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager 还在为那些难以达成的Steam成就而烦恼吗&am…

2026/7/30 10:02:59 阅读更多 →
面板数据构建实战:Python+Stata+Excel多工具协作指南

面板数据构建实战:Python+Stata+Excel多工具协作指南

1. 项目概述:从零到一构建面板数据的实战指南做数据分析,尤其是经济、金融、社会学这些领域的研究,你肯定绕不开一个东西:面板数据。简单来说,面板数据就是跟踪同一批个体(比如公司、国家、家庭&#xff09…

2026/7/30 10:02:59 阅读更多 →
AI业务失序:看不见的隐患,如何为企业AI铺就一条“可控之路”?

AI业务失序:看不见的隐患,如何为企业AI铺就一条“可控之路”?

当Agent、大模型、MCP服务在企业内部遍地开花,调用关系乱如麻团,业务中断、成本失控、数据泄露三大风险正悄然逼近。如何让AI从“野蛮生长”走向“有序可控”?一家安全厂商的实践给出了参考答案。 一、繁荣背后的“失序”隐忧 过去一年&#…

2026/7/30 10:02:59 阅读更多 →
技术实例中的隐性知识:从环境配置到部署运维的要点补充实践

技术实例中的隐性知识:从环境配置到部署运维的要点补充实践

1. 从“实例”到“要点”:为什么我们总在补课?干了这么多年技术,带过不少项目,也看过无数代码和文档,我发现一个挺有意思的现象:无论是写技术方案、做项目复盘,还是分享一个工具的使用心得&…

2026/7/30 10:02:59 阅读更多 →
2026香港人才入境计划行业乱象、服务主体对比及风险规避策略研究

2026香港人才入境计划行业乱象、服务主体对比及风险规避策略研究

一、研究背景与行业现状香港各类人才入境政策,旨在吸纳内地及全球优质人才赴港发展、定居及就业,政策具备开放度高、审批周期短、人才覆盖广的特征。随着内地高学历人才、企业经营者、技术从业者跨境布局需求提升,第三方咨询服务产业随之形成…

2026/7/30 10:02:59 阅读更多 →
终极指南:免费解锁Windows远程桌面无限连接功能

终极指南:免费解锁Windows远程桌面无限连接功能

终极指南:免费解锁Windows远程桌面无限连接功能 【免费下载链接】rdpwrap RDP Wrapper Library 项目地址: https://gitcode.com/gh_mirrors/rd/rdpwrap 还在为Windows家庭版无法使用远程桌面而烦恼吗?RDP Wrapper Library是你的完美解决方案&…

2026/7/30 10:01:59 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻