限制最大重试次数是防止网络请求陷入无限循环的关键手段,需结合计数控制、可重试错误判断、指数退避与抖动、每次请求状态隔离四方面实现。

限制最大重试次数是防止网络请求陷入无限循环的关键手段。核心在于明确计数、及时退出、不依赖模糊条件,同时配合合理的错误判断和延迟策略。
用计数器控制重试轮次
每次重试前递增一个计数变量,达到上限立即终止并抛出最终错误,不能靠异常自动重试而不设边界。
- 在手动封装函数中,用 attempt 变量从 0 开始计数,循环条件为 attempt <= maxRetries
- 在 Axios 拦截器中,通过 config.__retryCount 记录已重试次数,首次调用时初始化为 0
- 并发请求场景下(如 RequestParallelWithRetry),每个子请求单独维护自己的重试计数,避免全局共享导致误判
只对可重试错误触发重试
不是所有失败都该重试。盲目重试 401、404 或参数错误,只会延长失败路径,还可能掩盖真实问题。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 优先重试:网络中断(ERR_NETWORK)、超时(ECONNABORTED)、服务不可用(503)、限流(429)、服务器错误(5xx)
- 通常不重试:400(客户端语法错)、401/403(鉴权失败)、404(资源不存在)——这些属于业务逻辑问题,重试无意义
- fetch 场景中,需显式检查 res.ok 和 res.status,不能仅靠 catch 捕获就重试
配合指数退避与抖动,自然形成退出节奏
单纯设次数还不够,延迟策略本身也影响是否“卡住”。指数增长的等待时间会让高频失败快速收敛,减少无效轮次。
立即学习“Java免费学习笔记(深入)”;
- 基础延迟乘以 2^attempt,例如 100ms → 200ms → 400ms → 800ms
- 加上 Math.random() * 100 抖动,避免多客户端同步重试造成请求尖峰
- 第 3 次重试后延迟已达 800ms+,若仍失败,用户感知上已明显“卡顿”,此时终止更合理
确保每次重试都是独立干净的请求
重复使用旧的 config 或未重置 signal、timeout 等状态,可能导致请求被意外中止或复用过期上下文,引发难以排查的假失败。
- 每次循环内新建 AbortController,不复用上一轮实例
- 重新设置超时 timer(如 clearTimeout + setTimeout),避免旧定时器干扰
- 并发场景中,每个请求函数应返回全新 Promise,不缓存或复用上一次结果

















