重试组件须是可配置、可感知、可管控的协作契约。策略外置为对象,含maxretries、basedelayms、backofffactor、shouldretry、jitter;每次重试隔离上下文;提供cancel、cancelall、setglobalpolicy等控制接口;强制上报标准化重试日志。

团队请求重试组件不能只封装“重试次数+延时”,而要成为可配置、可感知、可管控的协作契约。关键在于把策略外置、行为收敛、边界清晰,让每个调用者知道“它会怎么重试”,也让维护者能统一治理异常路径。
策略必须解耦且运行时可覆盖
重试逻辑不能硬编码在 fetch 封装里,而应通过策略对象传入,字段包括:
- maxRetries:默认 2 次(首次 + 2 次重试),禁止设为 0 或无限
- baseDelayMs:基础延迟,如 500ms,用于计算退避时间
- backoffFactor:退避倍数,推荐 2(即 500ms → 1000ms → 2000ms)
- shouldRetry:函数,接收 (err, response) 参数,仅对 TypeError、AbortError、502/503/504 状态返回 true;明确排除 401、403、404、422
- jitter:布尔值,开启后在延迟基础上加 ±15% 随机偏移,防重试风暴
每次重试必须隔离上下文
同一管理器发起的多个请求,不能共享 AbortController、计时器或重试计数。正确做法是:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 每次重试前新建 AbortController,并将 signal 注入 fetch options
- 延迟使用 setTimeout + Promise.resolve(),而非 await new Promise()(避免阻塞 async 栈)
- 重试计数、当前延迟、已耗时等状态仅保留在本次递归/循环作用域内
- 禁止用闭包变量或 this.xxx 存储跨请求状态
暴露可控的生命周期接口
组件需提供显式控制能力,应对页面切换、用户取消等场景:
- cancel(id):根据唯一 ID 取消某次请求及其待重试任务
- cancelAll():清空所有 pending 和 scheduled 重试
- setGlobalPolicy(policy):全局策略变更(仅影响后续新请求)
- overridePolicy(id, policy):为某次请求临时替换策略(如上传文件时禁用重试)
强制上报与可观测性埋点
所有重试动作必须触发标准化日志,字段至少包含:
- event:'retry-start' / 'retry-succeed' / 'retry-failed' / 'retry-canceled'
- attempt:第几次尝试(从 1 开始)
- url:脱敏后的请求路径(如 /api/v1/orders → /api/v1/orders)
- status:HTTP 状态码或 err.name(如 'TypeError', 'AbortError')
- elapsedMs:从首次请求开始到当前事件的总耗时
- policy:实际生效的策略摘要(如 { maxRetries: 2, backoffFactor: 2 })
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










