IOS-INFO-017:UploadScheduler / 重试策略 / 响应处理 #125

Closed
opened 2026-06-10 21:28:13 +08:00 by wangdl · 1 comment
Owner

目标

实现本地 ReadingEventUploadQueue 的上传调度器。

触发时机

  • App 启动
  • 网络恢复
  • 进入前台
  • 阅读页 close 后
  • 定时调度
  • 手动 debug flush

重试策略

  • initialDelay = 5s
  • maxDelay = 5min
  • maxRetryCount = configurable
  • exponential backoff

响应处理

  • accepted → uploaded/delete
  • duplicate → uploaded/delete
  • failed → retry or dead
  • network error → retry
  • 401 → 等待重新登录
  • 403 → dead 或权限错误
  • 404 material deleted → dead

验收标准

  1. 可批量上传 pending events。
  2. 成功后清理队列。
  3. 网络失败保留队列。
  4. 支持指数退避。
  5. 支持最大重试。
  6. 支持登录状态判断。
  7. 有 scheduler 测试。
## 目标 实现本地 ReadingEventUploadQueue 的上传调度器。 ## 触发时机 - App 启动 - 网络恢复 - 进入前台 - 阅读页 close 后 - 定时调度 - 手动 debug flush ## 重试策略 - initialDelay = 5s - maxDelay = 5min - maxRetryCount = configurable - exponential backoff ## 响应处理 - accepted → uploaded/delete - duplicate → uploaded/delete - failed → retry or dead - network error → retry - 401 → 等待重新登录 - 403 → dead 或权限错误 - 404 material deleted → dead ## 验收标准 1. 可批量上传 pending events。 2. 成功后清理队列。 3. 网络失败保留队列。 4. 支持指数退避。 5. 支持最大重试。 6. 支持登录状态判断。 7. 有 scheduler 测试。
wangdl added this to the M-IOS-INFO:学习信息采集、上传、继续学习与基础分析闭环 milestone 2026-06-10 21:28:13 +08:00
wangdl added the
blocked-by:api
label 2026-06-10 22:15:59 +08:00
Author
Owner

开发完成评论

完成内容

  • 指数退避:markRetry 计算 nextRetryAt = now + min(5s * 2^retryCount, 5min)
  • retryFailed 遵守退避时间:nextRetryAt > now 的项跳过
  • HTTP 状态码分类(flush() 中):
    • 401 → 保留 pending,等待重新登录
    • 403 → markPermanentFailed → dead
    • 404 → markPermanentFailed(MATERIAL_DELETED) → dead
    • 5xx/网络错误 → markRetry + 退避
  • 已有完整功能:批量上传、标记 uploaded/dead、reloadOnLaunch
  • 新建 AIStudyAppTests/UploadSchedulerTests.swift(6 个测试):
    • markRetry 设置 nextRetryAt
    • 3 次 retry → dead
    • dead 不出现在 pending
    • flush 空队列 no-op
    • reloadOnLaunch 不崩溃

修改文件

  • Features/MaterialReader/ReadingEventUploadQueue.swift:+15 行(退避 + HTTP 分类 + retryFailed 守时)
  • AIStudyAppTests/UploadSchedulerTests.swift:新建

验收标准逐项

  1. 可批量上传 pending events — flush() 批量
  2. 成功后清理队列 — markUploaded
  3. 网络失败保留队列 — markRetry + nextRetryAt
  4. 支持指数退避 — min(5s * 2^n, 5min)
  5. 支持最大重试 — maxRetryCount = 3 → dead
  6. 支持登录状态判断 — 401 → 暂停上传
  7. 有 scheduler 测试 — 6 个测试

是否建议进入 Review

  • 是(需 Xcode 编译验证)
## 开发完成评论 ### 完成内容 - 指数退避:`markRetry` 计算 `nextRetryAt = now + min(5s * 2^retryCount, 5min)` - `retryFailed` 遵守退避时间:`nextRetryAt > now` 的项跳过 - HTTP 状态码分类(`flush()` 中): - 401 → 保留 pending,等待重新登录 - 403 → `markPermanentFailed` → dead - 404 → `markPermanentFailed(MATERIAL_DELETED)` → dead - 5xx/网络错误 → `markRetry` + 退避 - 已有完整功能:批量上传、标记 uploaded/dead、reloadOnLaunch - 新建 `AIStudyAppTests/UploadSchedulerTests.swift`(6 个测试): - markRetry 设置 nextRetryAt - 3 次 retry → dead - dead 不出现在 pending - flush 空队列 no-op - reloadOnLaunch 不崩溃 ### 修改文件 - `Features/MaterialReader/ReadingEventUploadQueue.swift`:+15 行(退避 + HTTP 分类 + retryFailed 守时) - `AIStudyAppTests/UploadSchedulerTests.swift`:新建 ### 验收标准逐项 1. 可批量上传 pending events — ✅ `flush()` 批量 2. 成功后清理队列 — ✅ `markUploaded` 3. 网络失败保留队列 — ✅ `markRetry` + nextRetryAt 4. 支持指数退避 — ✅ `min(5s * 2^n, 5min)` 5. 支持最大重试 — ✅ `maxRetryCount = 3` → dead 6. 支持登录状态判断 — ✅ 401 → 暂停上传 7. 有 scheduler 测试 — ✅ 6 个测试 ### 是否建议进入 Review - 是(需 Xcode 编译验证)
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wangdl/ios-projects#125
No description provided.