离线同步失败采用指数退避重试,初始延迟1秒,按min(1000×2ⁿ,30000)计算,最多重试5~10次,叠加0~50%随机抖动,并结合网络/页面可见性状态智能暂停,成功后重置所有状态。

离线同步失败时用指数退避重试,核心是让重试间隔随失败次数递增(如 1s → 2s → 4s → 8s),避免在设备刚恢复网络或服务刚回暖时,所有待同步任务集中爆发,冲击后端。
明确哪些失败才值得重试
不是所有错误都该重试:
- ✅ 推荐重试:网络超时、连接拒绝、5xx 服务器错误、429 限流响应
- ❌ 不该重试:400/401/403/404 等客户端错误、数据校验失败、本地存储损坏
- ⚠️ 可配置开关:对 409 冲突(如版本冲突)是否重试,需结合业务幂等性判断
设计合理的退避参数与流程
每次同步失败后,不立即重试,而是按规则计算延迟并延后执行:
- 初始延迟(
baseDelay)设为 1000ms(1 秒),足够避开瞬时抖动 - 每次失败后,延迟 =
min(baseDelay × 2ⁿ, maxDelay),其中n是当前重试次数(从 0 开始) -
maxDelay建议设为 30000ms(30 秒),匹配多数网关空闲超时 - 最大重试次数(
maxRetries)建议设为 5~10 次;超过即标记同步失败,交由用户手动触发或下次启动时再试
必须加入随机抖动(jitter)
纯指数增长仍可能导致多条离线记录在同一毫秒级窗口内重试。加抖动打破同步:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 在基础延迟上叠加
0 ~ delay × 0.5的随机值 - 示例:第 3 次失败,基础延迟为 4000ms,则实际等待
4000 + Math.random() * 2000ms(即 4–6 秒之间) - 这能显著降低并发重试概率,缓解服务端压力
结合设备状态做智能暂停
离线同步常发生在后台或页面不可见时,需适配运行环境:
- 监听
navigator.onLine:离线时不启动新重试,已排队任务暂挂 - 监听
document.visibilityState:页面隐藏时暂停定时器,切回可见后再续 - 对移动 App,还可监听系统网络变化事件(如 Android 的 ConnectivityManager 或 iOS 的 NWPathMonitor)
同步成功后务必重置状态
一次成功同步,意味着上下文已更新,退避状态必须清零:
- 将当前延迟重置为
baseDelay - 将重试计数归零
- 清除所有 pending 的
setTimeout句柄(防止旧定时器误触发) - 可选:上报“同步恢复”事件,用于 UI 提示或埋点统计
不复杂但容易忽略










