1. 为什么需要重试机制与并发限制在实际业务开发中网络抖动、服务短暂不可用、数据库连接超时等问题时有发生。简单粗暴地让请求直接失败显然不是最佳选择我们需要一种更优雅的容错机制。重试机制的核心价值在于自动处理瞬时故障如网络闪断提高系统整体可用性减少人工干预成本而并发限制则是为了防止重试风暴导致的系统雪崩资源耗尽引发的连锁故障恶意或异常请求对系统的冲击Spring Boot通过Retryable注解和并发控制组件的组合为我们提供了一套开箱即用的解决方案。下面我们就来深入探讨如何在实际项目中应用这些机制。2. Retryable注解的实战配置2.1 基础环境准备首先确保项目中已经引入Spring Retry依赖dependency groupIdorg.springframework.retry/groupId artifactIdspring-retry/artifactId /dependency dependency groupIdorg.springframework/groupId artifactIdspring-aspects/artifactId /dependency然后在启动类上添加EnableRetry注解SpringBootApplication EnableRetry public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }2.2 核心参数详解Retryable注解支持以下关键配置Retryable( value {SQLException.class, IOException.class}, // 触发重试的异常类型 maxAttempts 3, // 最大重试次数含首次调用 backoff Backoff(delay 1000, multiplier 2) // 退避策略 ) public void serviceMethod() { // 业务逻辑 }其中backoff策略特别值得关注delay初始延迟时间毫秒multiplier延迟时间乘数下次延迟上次延迟×乘数maxDelay最大延迟时间防止延迟过长2.3 重试失败后的处理当重试耗尽仍未成功时可以通过Recover注解定义降级逻辑Recover public void recover(SQLException e) { // 记录失败日志 // 发送告警通知 // 执行补偿操作 }注意Recover方法的返回值类型必须与Retryable方法一致且异常类型要匹配。3. 高级重试策略实现3.1 自定义重试决策逻辑有时简单的异常类型判断不够灵活我们可以实现RetryPolicy接口public class CustomRetryPolicy implements RetryPolicy { Override public boolean canRetry(RetryContext context) { Throwable lastThrowable context.getLastThrowable(); if(lastThrowable instanceof BusinessException) { return ((BusinessException) lastThrowable).isRetryable(); } return true; } // 其他必要方法实现... }然后在配置类中注册Bean public RetryTemplate retryTemplate() { RetryTemplate template new RetryTemplate(); template.setRetryPolicy(new CustomRetryPolicy()); return template; }3.2 基于状态码的重试对于HTTP调用我们可能需要根据状态码决定是否重试Retryable( include {RestClientException.class}, exclude {HttpClientErrorException.class}, exceptionExpression #{message.contains(503) || message.contains(504)} ) public ResponseEntityString callExternalService() { // 调用外部服务 }4. 并发限制的实现方案4.1 信号量限流使用Guava的RateLimiter实现简单限流Bean public RateLimiter apiRateLimiter() { return RateLimiter.create(10.0); // 每秒10个请求 } Around(annotation(rateLimited)) public Object rateLimit(ProceedingJoinPoint pjp, RateLimited rateLimited) throws Throwable { if(apiRateLimiter.tryAcquire()) { return pjp.proceed(); } throw new RateLimitExceededException(); }4.2 分布式限流在集群环境中可以使用Redis实现分布式令牌桶public boolean tryAcquire(String key, int limit, int timeout) { String script local current redis.call(get, KEYS[1])\n if current and tonumber(current) tonumber(ARGV[1]) then\n return 0\n else\n redis.call(incr, KEYS[1])\n redis.call(expire, KEYS[1], ARGV[2])\n return 1\n end; Long result redisTemplate.execute( new DefaultRedisScript(script, Long.class), Collections.singletonList(key), limit, timeout ); return result 1; }5. 生产环境中的最佳实践5.1 监控与告警重试机制需要配套完善的监控重试次数统计重试成功率监控最终失败率告警建议使用Micrometer集成监控系统Retryable(recover recoverMethod) public String businessOperation() { return meterRegistry.timer(business.operation) .record(() - actualBusinessLogic()); }5.2 幂等性设计重试机制必须配合幂等设计使用唯一请求ID数据库乐观锁状态机校验Transactional public void updateOrder(String orderId, OrderStatus status) { Order order orderRepository.findById(orderId) .orElseThrow(() - new OrderNotFoundException(orderId)); if(!order.canTransitionTo(status)) { throw new IllegalStateException(Invalid status transition); } order.setStatus(status); orderRepository.save(order); }5.3 性能优化建议异步重试对于耗时操作考虑使用Async分级重试首次快速重试后续逐渐延长间隔熔断机制配合Hystrix或Resilience4j使用Retryable CircuitBreaker(failureRateThreshold 30%) TimeLimiter(name serviceCall) public CompletableFutureString asyncServiceCall() { return CompletableFuture.supplyAsync(() - { // 业务逻辑 }); }6. 常见问题排查6.1 重试不生效的排查步骤检查是否添加了EnableRetry确认方法是否为public验证是否被AOP代理Spring管理的Bean检查异常类型是否匹配6.2 并发限制失效的可能原因限流器未正确注入拦截路径配置错误分布式环境下时钟不同步Redis连接异常导致限流失效6.3 性能瓶颈定位当系统出现性能下降时检查重试日志中的时间戳监控线程池使用情况分析Redis限流命令耗时评估退避策略是否合理我在实际项目中发现将最大重试次数设置为5次以上时系统尾延迟会显著增加。建议非关键业务最多重试3次关键业务不超过5次同时配合适当的退避策略。
企业数字化 ERP 产品动态
相关推荐
Genesis Plus GX:免费世嘉模拟器终极指南,重温经典游戏时光 Genesis Plus GX:免费世嘉模拟器终极指南,重温经典游戏时光 【免费下载链接】Genesis-Plus-GX An enhanced port of Genesis Plus - accurate & portable Sega 8/16 bit emulator 项目地址: https://gitcode.com/gh_mirrors/ge/Genesis-Plus-GX … · 2026/9/11 16:10:52
基于Qt WebChannel构建高性能桌面WebApp:架构设计与实战 1. 项目概述:为什么选择Qt来构建WebApp?在很多人印象里,Qt是桌面应用开发的王者,用它来做WebApp,听起来有点“跨界”。我最初接触这个想法时也犯嘀咕,但经过几个实战项目的洗礼,我发现这恰恰是Q… · 2026/9/20 20:13:09
找电子商务网站开发公司别只看报价,这份对比评测能救你的流量 找电子商务网站开发公司别只看报价,这份对比评测能救你的流量 网站上线三个月,后台数据惨淡。 每天只有几个蜘蛛爬行,真实访客寥寥无几。 老板问起来,你只能尴尬地解释还在“养站”。 别把锅全甩给SEO,很多时候是底子没打好。 很多企业主找… · 2026/9/27 5:09:56
USB设备偶尔断连、识别不到?从枚举到驱动的系统排查指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 5:09:56
GSD文件大全:工业自动化设备组态必备指南与版本管理实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 5:09:56
5个免费工具搞定网站代理建设,避开模板坑 5个免费工具搞定网站代理建设,避开模板坑 刚做网站代理这行,最头疼的不是没客户,而是客户拿着手机指着你说:“这模板太丑了,根本不够用,换个高级点的。”这时候你才意识到,光靠买现成的模板库,根本接不住现在这些懂点审美的老板。很多新手代理觉得建… · 2026/9/27 5:09:56
不会代码做专业高端网站建设?5步图解步骤避坑指南 不会代码做专业高端网站建设?5步图解步骤避坑指南 手里拿着需求文档,看着空白的电脑屏幕,心里直打鼓:我想搞个高大上的官网,展示公司实力,但我连 HTML… · 2026/9/27 5:09:49
中秋福利!奶茶外卖打车全覆盖 这几个场景花得最值(最低0.01元起)
要说券的利用率,早点和下午茶排第一。楼下便利店两个包子加一杯豆浆,七八块钱,用券之后付几毛甚至零元,连着几天的早饭钱省出来了。想喝奶茶也行,一杯十几块的… · 2026/9/27 5:09:30
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01