news 2026/3/2 9:56:32

淘客系统的容灾演练与恢复:Java Chaos Monkey模拟节点故障下的服务降级与快速切换实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
淘客系统的容灾演练与恢复:Java Chaos Monkey模拟节点故障下的服务降级与快速切换实践

淘客系统的容灾演练与恢复:Java Chaos Monkey模拟节点故障下的服务降级与快速切换实践

大家好,我是 微赚淘客系统3.0 的研发者省赚客!

高可用是淘客系统的核心要求。为验证在数据库宕机、缓存失效或服务实例崩溃等异常场景下系统的自愈能力,我们引入 Chaos Monkey 思想,结合 Spring Boot Actuator 与自研故障注入模块,在预发环境主动制造故障,并通过 Sentinel 与多活架构实现服务降级与快速切换。

Chaos Monkey 故障注入模块设计

我们基于 Spring Boot 开发轻量级 Chaos Agent,支持运行时注入延迟、异常或服务中断:

packagejuwatech.cn.chaos;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Component;importjava.util.Random;@ComponentpublicclassChaosInjector{@Value("${chaos.enabled:false}")privatebooleanchaosEnabled;@Value("${chaos.failure.rate:0.1}")privatedoublefailureRate;privatefinalRandomrandom=newRandom();publicvoidmaybeThrowException(StringserviceName){if(!chaosEnabled)return;if(random.nextDouble()<failureRate){juwatech.cn.util.AsyncLogger.logAsync("Chaos injected: killing "+serviceName);thrownewRuntimeException("Simulated failure in "+serviceName);}}publicvoidmaybeDelay(longmaxDelayMs){if(!chaosEnabled)return;if(random.nextDouble()<failureRate){longdelay=random.nextInt((int)maxDelayMs);try{Thread.sleep(delay);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}}}}

在关键服务中嵌入故障点:

packagejuwatech.cn.service;importjuwatech.cn.chaos.ChaosInjector;importorg.springframework.stereotype.Service;@ServicepublicclassCouponRemoteService{privatefinalChaosInjectorchaosInjector;publicCouponRemoteService(ChaosInjectorchaosInjector){this.chaosInjector=chaosInjector;}publicStringfetchCouponFromRemote(StringitemId){// 模拟调用第三方接口前注入故障chaosInjector.maybeThrowException("coupon-remote-api");chaosInjector.maybeDelay(2000);// 实际调用逻辑(略)return"CPN_"+itemId;}}

Sentinel 服务降级规则配置

当远程服务不可用时,自动触发 fallback:

packagejuwatech.cn.fallback;importcom.alibaba.csp.sentinel.slots.block.BlockException;publicclassCouponFallback{publicstaticStringremoteFallback(StringitemId,BlockExceptionex){juwatech.cn.util.AsyncLogger.logAsync("Fallback triggered for item: "+itemId);return"DEFAULT_COUPON_5YUAN";// 返回兜底优惠券}publicstaticStringdbFallback(StringuserId,BlockExceptionex){return"[]";// 返回空列表}}

通过 Sentinel 注解绑定资源与降级策略:

packagejuwatech.cn.service;importcom.alibaba.csp.sentinel.annotation.SentinelResource;importjuwatech.cn.fallback.CouponFallback;importorg.springframework.stereotype.Service;@ServicepublicclassCouponQueryService{@SentinelResource(value="fetchCouponFromRemote",blockHandler="remoteFallback",blockHandlerClass=CouponFallback.class)publicStringqueryCoupon(StringitemId){returnnewCouponRemoteService(newjuwatech.cn.chaos.ChaosInjector()).fetchCouponFromRemote(itemId);}}

动态加载降级规则(启动时初始化):

packagejuwatech.cn.config;importcom.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;importcom.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;importorg.springframework.context.annotation.Configuration;importjavax.annotation.PostConstruct;importjava.util.Collections;@ConfigurationpublicclassSentinelDegradeConfig{@PostConstructpublicvoidinitDegradeRules(){DegradeRulerule=newDegradeRule("fetchCouponFromRemote").setGrade(com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule.RT)// 基于响应时间.setCount(200)// 超过200ms视为慢调用.setTimeWindow(10)// 熔断10秒.setMinRequestAmount(5)// 最小请求数.setSlowRatioThreshold(0.5);// 慢调用比例阈值DegradeRuleManager.loadRules(Collections.singletonList(rule));}}

多活数据库快速切换机制

主库故障时,自动切换至只读副本。我们封装数据源路由逻辑:

packagejuwatech.cn.datasource;importorg.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;publicclassRoutingDataSourceextendsAbstractRoutingDataSource{@OverrideprotectedObjectdetermineCurrentLookupKey(){returnDataSourceContext.getDataSourceType();}}

上下文管理:

packagejuwatech.cn.datasource;publicclassDataSourceContext{privatestaticfinalThreadLocal<String>contextHolder=newThreadLocal<>();publicstaticvoidsetMaster(){contextHolder.set("master");}publicstaticvoidsetSlave(){contextHolder.set("slave");}publicstaticStringgetDataSourceType(){returncontextHolder.get()!=null?contextHolder.get():"master";}}

在数据库操作前检测主库健康状态:

packagejuwatech.cn.service;importjuwatech.cn.datasource.DataSourceContext;importorg.springframework.stereotype.Service;@ServicepublicclassOrderService{privatefinaljuwatech.cn.db.HealthCheckerhealthChecker;publicOrderService(juwatech.cn.db.HealthCheckerhealthChecker){this.healthChecker=healthChecker;}publicvoidcreateOrder(StringorderId){if(!healthChecker.isMasterDbHealthy()){DataSourceContext.setSlave();// 临时切到从库(仅限查询)thrownewIllegalStateException("Master DB down, write operation blocked");}DataSourceContext.setMaster();// 执行写入}}

健康检查实现:

packagejuwatech.cn.db;importorg.springframework.jdbc.core.JdbcTemplate;importorg.springframework.stereotype.Component;@ComponentpublicclassHealthChecker{privatefinalJdbcTemplatemasterJdbcTemplate;publicHealthChecker(JdbcTemplatemasterJdbcTemplate){this.masterJdbcTemplate=masterJdbcTemplate;}publicbooleanisMasterDbHealthy(){try{masterJdbcTemplate.queryForObject("SELECT 1",Integer.class);returntrue;}catch(Exceptione){juwatech.cn.util.AsyncLogger.logAsync("Master DB health check failed: "+e.getMessage());returnfalse;}}}

演练流程与指标验证

  1. 启动 Chaos Monkey(chaos.enabled=true
  2. 触发高频查券请求
  3. 监控 Prometheus 指标:
    • sentinel_block_requests_total(降级次数)
    • http_server_requests_seconds_count{status="500"}(错误率)
  4. 验证 Kibana 中 fallback 日志是否正常记录
  5. 模拟主库宕机,观察数据源切换日志与业务影响范围

通过上述机制,系统在节点故障下仍能提供基础服务能力,保障核心链路可用性。

本文著作权归 微赚淘客系统3.0 研发团队,转载请注明出处!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/1 20:46:02

Runpod Serverless 从 0 到 1:本地跑通 → 镜像构建 → Endpoint 部署 → 在线压测(保姆级踩坑版)

Runpod Serverless 从 0 到 1:本地跑通 → 镜像构建 → Endpoint 部署 → 在线压测(保姆级踩坑版) 0. 你最终会得到什么 1) 准备工作(别跳过这一步) 2) 建开发环境:虚拟环境 + 安装 runpod SDK 3) 写 Worker:handler.py(最小可用模板) 4) 本地测试:先把“逻辑”跑通再…

作者头像 李华
网站建设 2026/2/28 0:52:13

系统工程师/SE十年演进

系统工程师&#xff08;Systems Engineer, SE&#xff09; 的十年&#xff08;2015–2025&#xff09;&#xff0c;是从“底层架构的搭建者”向“全栈智能化系统的编排者”进化的十年。 这十年中&#xff0c;SE 的工作重心从传统的服务器运维和网络拓扑&#xff0c;转向了以云原…

作者头像 李华
网站建设 2026/2/28 0:01:20

基于RA单片机移植CoreMark跑分源码

关注星标公众号&#xff0c;不错过精彩内容 来源 | 瑞萨嵌入式小百科 在嵌入式处理器领域最为知名和常见测试CPU性能的就是&#xff1a; CoreMark 和 Dhrystone。 CoreMark是用来衡量嵌入式系统中中心处理单元&#xff08;CPU&#xff0c;或叫做微控制器MCU&#xff09;性能的标…

作者头像 李华
网站建设 2026/3/1 15:45:59

树莓派的一些问题记录-3:CM0的远程SSH连接配置

在树莓派CM0上需要先与预装系统&#xff0c;但是CM0没有图像解码&#xff0c;所以采用SSH连接是一个很好的选项。 本记录是在系统已经装好的情况下继续的 确保树莓派上已经安装了SSH服务器。在树莓派上&#xff0c;你可以通过终端运行以下命令来安装&#xff1a; sudo apt upd…

作者头像 李华
网站建设 2026/2/27 9:00:08

STM32单片机HardFault死机现场分析:堆栈回溯

前言当单片机突然死机&#xff08;HardFault&#xff09;&#xff0c;调试器停下来时&#xff0c;通常停在 HardFault_Handler 的死循环里。 这时候&#xff0c;大部分人会感到很茫然&#xff0c;或者盲目地去检查上一行修改的代码。HardFault 是什么&#xff1f;HardFault&…

作者头像 李华