基于优先级的请求重试调度是按业务重要性动态调度待重试请求的机制:高优请求并发执行,低优请求排队、延迟或丢弃;通过双条件排序队列(priority降序、nextRetryAt升序)与定时轮询实现,并支持上下文动态调优、限流降级及网络恢复抖动唤醒。

什么是基于优先级的请求重试调度
它不是简单地“失败就重试”,而是在多个待重试请求共存时,按业务重要性(如用户操作、支付、日志上报)决定谁先重试、谁可降级或丢弃。核心是:**同一时刻只并发执行有限个高优重试,低优请求排队、延迟或被限流**。
用队列 + 优先级比较器实现调度
维护一个带优先级的最小堆(或排序队列),每次从队首取最高优请求执行;重试失败后按退避策略(如指数退避)计算下次入队时间,并重新插入对应位置。
- 用数组模拟优先队列更轻量:插入时 按 priority(数值越大越优先)和 nextRetryAt(时间戳越小越早)双条件排序
- 示例排序逻辑:
queue.sort((a, b) => b.priority - a.priority || a.nextRetryAt - b.nextRetryAt) - 启动一个定时器(如
setInterval)每 50ms 检查一次队首:若nextRetryAt ≤ Date.now(),则取出并发起请求
结合请求上下文动态调整优先级
优先级不应写死。可在请求发起时注入上下文,在重试前重新评估:
- 用户正在输入表单 → 当前请求 priority = 10;页面已关闭 → 自动降为 0 并取消重试
- 支付接口连续失败 3 次 → 提升 priority 并缩短退避时间,避免超时;埋点上报失败 → 降为 2,允许延迟 2s 后重试
- 监听
visibilitychange或pagehide,对非活跃页的低优请求直接清空队列
防雪崩:主动限流与优雅降级
即使有优先级,也要防止重试洪峰压垮客户端或服务端:
立即学习“Java免费学习笔记(深入)”;
- 全局限制最大并发重试数(如 maxConcurrent = 3),新高优请求到来时,若队列已满且有更低优任务,可踢出最末尾的 1 个
- 为每类请求设置最大重试次数和总超时(如支付最多重试 2 次,总耗时 ≤ 8s),超限后调用
onFailure回调交由业务处理 - 网络恢复时(
navigator.onLine变为 true),可批量唤醒高优请求,但需加随机抖动(±300ms)避免瞬时冲击


















