瞧瞧别人家的接口重试,那叫一个优雅!

news/2026/1/18 11:01:07/文章来源:https://www.cnblogs.com/12lisu/p/19497986

前言

记得五年前的一个深夜,某个电商平台的订单退款接口突发异常,因为银行系统网络抖动,退款请求连续失败。

原本技术团队只是想“好心重试几次”,结果开发小哥写的重试代码竟疯狂调用了银行的退款接口 82次

最终导致用户账户重复退款,平台损失过百万。

老板在复盘会上质问:“接口重试这么基础的事,为什么还能捅出大篓子?”

大家哑口无言,因为所有人都以为只要加个 for 循环,再睡几秒就完事了……

这篇文章跟大家一起聊聊重试的7种常用方案,希望对你会有所帮助。

1 暴力轮回法

问题场景

某实习生写的用户注册短信发送接口。

在一个while循环中,重复调用第三方的发短信接口给用户发送短信。

代码如下:

public void sendSms(String phone) {int retry = 0;while (retry < 5) { // 无脑循环try {smsClient.send(phone);break;} catch (Exception e) {retry++;Thread.sleep(1000); // 固定1秒睡眠}}
}

事故现场

某次短信服务器出现了过载问题,导致所有请求都延迟了3秒。

这个暴力循环的代码在 0.5秒内同时发起数万次重试,直接打爆短信平台,触发了 熔断封禁,连正常请求也被拒绝。

教训

  • 💥 不做延迟间隔调整:固定间隔导致重试请求集中爆发
  • 💥 无视异常类型:非临时性错误(如参数错误)也尝试重试
  • 🔑 修复方案:加上随机的重试间隔,并过滤不可重试的异常

2 Spring Retry

应用场景

Spring Retry适用于中小项目,通过注解快速实现基本重试和熔断(如订单状态查询接口)。

通过声明@Retryable注解,来实现接口重试的功能。

配置示例

@Retryable(value = {TimeoutException.class}, // 只重试超时异常maxAttempts = 3,backoff = @Backoff(delay = 1000, multiplier = 2) // 1秒→2秒→4秒
)
public boolean queryOrderStatus(String orderId) {return httpClient.get("/order/" + orderId);
}@Recover // 兜底回退方法
public boolean fallback() {return false; 
}

优势

  • 声明式注解:代码简洁,与业务逻辑解耦
  • 指数退避:自动拉长重试间隔
  • 熔断集成:结合 @CircuitBreaker 可快速阻断异常流量

3 Resilience4j

高阶场景

对于有些需要自定义退避算法、熔断策略和多层防护的大中型系统(如支付核心接口),我们可以使用 Resilience4j。

核心代码如下:

// 1. 重试配置:指数退避 + 随机抖动
RetryConfig retryConfig = RetryConfig.custom().maxAttempts(3).intervalFunction(IntervalFunction.ofExponentialRandomBackoff(1000L, // 初始间隔1秒2.0,   // 指数倍数0.3    // 随机抖动系数)).retryOnException(e -> e instanceof TimeoutException).build();// 2. 熔断配置:错误率超50%时熔断
CircuitBreakerConfig cbConfig = CircuitBreakerConfig.custom().slidingWindow(10, 10, CircuitBreakerConfig.SlidingWindowType.COUNT_BASED) .failureRateThreshold(50).build();// 组合使用
Retry retry = Retry.of("payment", retryConfig);
CircuitBreaker cb = CircuitBreaker.of("payment", cbConfig);// 执行业务逻辑
Supplier<Boolean> supplier = () -> paymentService.pay();
Supplier<Boolean> decorated = Decorators.ofSupplier(supplier).withRetry(retry).withCircuitBreaker(cb).decorate();

效果

某电商大厂上线此方案后,支付接口 超时率下降60% ,且熔断触发频率降低近 90%

真正做到了“打不还手,骂不还口”。

4 MQ队列

适用场景

高并发、允许延时的异步场景(如物流状态同步)。

实现原理

  1. 首次请求失败后,将消息投递至 延时队列
  2. 队列根据预设的延时时间(如5秒、30秒、1分钟)重试消费
  3. 若达到最大重试次数,则转存至 死信队列(人工处理)

RocketMQ代码片段如下:

// 生产者发送延时消息
Message<String> message = new Message();
message.setBody("订单数据");
message.setDelayTimeLevel(3); // RocketMQ预设的10秒延迟级别
rocketMQTemplate.send(message);// 消费者重试
@RocketMQMessageListener(topic = "DELAY_TOPIC")
public class DelayConsumer {@Overridepublic void handleMessage(Message message) {try {syncLogistics(message);} catch (Exception e) {// 重试次数 + 1,并重新发送到更高延迟级别resendWithDelay(message, retryCount + 1);}}
}

如何RocketMQ的消费者消费失败,会自动发起重试。

5 定时任务

适用场景

对于有些不需要实时反馈,允许批量处理的任务(如文件导入)的业务场景,我们可以使用定时任务。

在这里以Quartz为例。

具体代码如下:

@Scheduled(cron = "0 0/5 * * * ?") // 每5分钟执行
public void retryFailedTasks() {List<FailedTask> list = failedTaskDao.listUnprocessed(5); // 查失败任务list.forEach(task -> {try {retryTask(task);task.markSuccess();} catch (Exception e) {task.incrRetryCount();}failedTaskDao.update(task);});
}

6 两阶段提交

适用场景

对于严格保证数据一致性的场景(如资金转账),我们可以使用两阶段提交机制。

关键实现

  1. 第一阶段:记录操作流水到数据库(状态为“进行中”)
  2. 第二阶段:调用远程接口,并根据结果更新流水状态
  3. 定时补偿:扫描超时的“进行中”流水重新提交

大致代码如下:

@Transactional
public void transfer(TransferRequest req) {// 1. 记录流水transferRecordDao.create(req, PENDING);// 2. 调用银行接口boolean success = bankClient.transfer(req);// 3. 更新流水状态transferRecordDao.updateStatus(req.getId(), success ? SUCCESS : FAILED);// 4. 失败转异步重试if (!success) {mqTemplate.send("TRANSFER_RETRY_QUEUE", req);}
}

7 分布式锁

应用场景

对于一些多服务实例、多线程环境的防重复提交(如秒杀)的业务场景,我们可以使用分布式锁。

这里以Redis + Lua的分布式锁为例。

代码如下:

public boolean retryWithLock(String key, int maxRetry) {String lockKey = "api_retry_lock:" + key;for (int i = 0; i < maxRetry; i++) {// 尝试获取分布式锁if (redis.setnx(lockKey, "1", 30, TimeUnit.SECONDS)) {try {return callApi();} finally {redis.delete(lockKey);}}Thread.sleep(1000 * (i + 1)); // 等待释放锁}return false;
}

总结

重试就像机房里的灭火器——永远不希望用到它,但必须保证关键时刻能救命。

我们工作中选择哪种方案?

别只看技术潮流,而要看业务的长矛和盾牌,需要哪种配合。

最后送大家一句话:系统稳定的秘诀,是永远对重试保持敬畏。

最后说一句(求关注,别白嫖我)

如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下我的同名公众号:苏三说技术,您的支持是我坚持写作最大的动力。

求一键三连:点赞、转发、在看。

关注公众号:【苏三说技术】,在公众号中回复:进大厂,可以免费获取我最近整理的10万字的面试宝典,好多小伙伴靠这个宝典拿到了多家大厂的offer。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1177896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完整教程:算法王冠上的明珠——动态规划之路径问题(第一篇)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

论文查重前必备的5款AIGC检测工具盘点 - 还在做实验的师兄

2026年几乎所有高校都要求进行AIGC检测,AI率超过20%就会被标记。提交学校前一定要自己先测一下,但不同平台算法差异大,最好用学校指定的同款。这篇文章盘点5款主流AIGC检测工具,附带高效的降AI方案。论文查重前必备…

python学习笔记-并发和异步IO

一、并发请求实现 1、多线程实现并发from concurrent.futures import ThreadPoolExecutor import requests import timedef task(url):response=requests.get(url)print(url,response)pool=ThreadPoolExecutor(7)url_l…

2026年胶囊充填机优质生产商Top10,天宏机械实力入选 - 工业品牌热点

在制药装备行业快速发展的当下,一款高效合规的胶囊充填设备是药企提升产能、降低风险的核心利器。面对市场上参差不齐的供应商,如何找到既能满足GMP标准、又能适配不同生产规模的胶囊充填机优质生产商?以下结合行业…

从零开始:用 Android Studio 开发一个 AI 智能日记 App - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

聊聊压缩空气检测资深企业,杭州华量检测技术实力和口碑咋样? - 工业品牌热点

问题1:压缩空气检测对企业来说有什么实际意义?为什么不能随便找家公司做? 压缩空气检测看似是幕后工作,实则是生产安全与产品质量的隐形防线。对于食品、医药、电子等行业而言,压缩空气中的油分、水分、微生物或固…

EtherCAT总线通信学习资料:STM32 MCU AX58100 ESC从站实现方案及一手资源

EtherCAT总线通信学习资料&#xff0c;一手资料。 提供基于stm32 mcuAX58100 ESC实现从站的具体方案&#xff0c;有完整的工程文件&#xff0c;提供源码以及工程配置、程序修改的视频&#xff0c;工程在开发板上已测。 提供不同版本工具从站工程。 支持主站下发固件程序&#x…

详细介绍:算法王冠上的明珠——动态规划之斐波那契数列问题(第二篇)

详细介绍:算法王冠上的明珠——动态规划之斐波那契数列问题(第二篇)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &q…

韩秀云老师谈买黄金

网址&#xff1a;韩秀云老师谈买黄金

19.螺旋矩阵

54. 螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7] 【思路】 首先设…

付费问答系统的设计与实现毕业论文+PPT(附源代码+演示视频)

文章目录付费问答系统的设计与实现一、项目简介&#xff08;源代码在文末&#xff09;1.运行视频2.&#x1f680; 项目技术栈3.✅ 环境要求说明4.包含的文件列表&#xff08;含论文&#xff09;数据库结构与测试用例系统功能结构前端运行截图后端运行截图项目部署源码下载付费问…

PostgreSQL实战:一文掌握 pg_hba.conf 配置,涵盖密码认证、IP限制与安全策略

文章目录一、pg_hba.conf 基础认知1.1 pg_hba.conf 概述1.2 文件位置与作用1.3 基本语法结构1.4 安全加固 checklist二、TYPE 字段详解&#xff1a;连接类型三、DATABASE 字段&#xff1a;目标数据库四、USER 字段&#xff1a;目标用户五、ADDRESS 字段&#xff1a;客户端地址限…

ACPI!ACPIBuildProcessGenericList函数中2次InterlockedCompareExchange函数作用是标记为WORK_DONE_PENDING下次直接略过

ACPI!ACPIBuildProcessGenericList函数中2次InterlockedCompareExchange函数作用是标记为WORK_DONE_PENDING下次直接略过//// Check to see if we have any work to do on the request//workDone InterlockedCompareExchange(&(buildRequest->WorkDone),WORK_DONE_PEND…

2025年市场上服务好的广告厂家有哪些,户外广告/地铁广告/航空广告/地铁站广告/电梯广告,广告设计找哪家 - 品牌推荐师

行业洞察:广告业服务升级背后的技术驱动与场景深耕 2025年,广告行业正经历从“流量争夺”向“场景价值挖掘”的深度转型。随着消费者触媒习惯的碎片化,广告主对精准投放、全域覆盖及效果可量化的需求日益迫切。据CT…

告别查重焦虑!虎贲等考 AI 降重降 AIGC:一次操作双重达标,论文合规不丢质

毕业季的论文定稿环节&#xff0c;无数学生陷入两难&#xff1a;重复率超标被打回&#xff0c;AI 辅助撰写的内容又因 “机器感” 过强被检测&#xff1b;手动降重改到语句不通&#xff0c;普通工具改写又丢了核心观点。当学术审核进入 “查重 AIGC 检测” 双门槛时代&#xf…

从Demo到上线:IndexTTS-2-LLM企业级部署步骤详解

从Demo到上线&#xff1a;IndexTTS-2-LLM企业级部署步骤详解 1. 引言 1.1 业务场景描述 随着智能语音技术的快速发展&#xff0c;企业对高质量、低成本、易集成的文本转语音&#xff08;Text-to-Speech, TTS&#xff09;系统需求日益增长。无论是客服机器人、有声内容生成&a…

AtCoder Beginner Contest竞赛题解 | AtCoder Beginner Contest 435

​欢迎大家订阅我的专栏:算法题解:C++与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的…

2026学历提升攻略:口碑学校引领未来方向,国家开放大学招生/自考培训/学历提升/专升本报名,学历提升机构口碑推荐榜 - 品牌推荐师

在当今知识经济时代,学历不仅是个人知识储备的证明,更是职场晋升、职业转型、社会评价的核心凭证。对于广大在职人士而言,一个权威、便捷、高效的学历提升路径,能够有效打破职业天花板,为个人发展注入持续动能。然…

2026年市面上有名的河道护坡石笼网公司有哪些,柔韧抗压石笼网/镀锌低碳钢丝石笼网,河道护坡石笼网供应商口碑推荐 - 品牌推荐师

随着国家对水利基础设施建设的持续投入,河道护坡工程作为防洪减灾、生态修复的核心环节,其技术标准与材料质量要求日益严苛。石笼网因其柔性结构、透水性强、抗冲刷能力突出等特性,成为河道护坡领域的首选材料。然而…

一图胜千言!虎贲等考 AI 科研绘图功能让数据可视化秒变顶刊水准

还在为 Origin 调参调到崩溃&#xff1f;还在因 Excel 画不出高难度热图 emo&#xff1f;还在被导师吐槽 “图表不规范、配色辣眼睛”&#xff1f;在科研圈&#xff0c;一张精准、美观、规范的图表&#xff0c;是论文加分的硬核利器&#xff0c;更是学术成果展示的 “门面担当”…