Appearance
L02-16 异步与批处理:灌库不能拖垮在线服务
全局中心内容:重活必须离线化,在线服务只负责发起和查询进度。 全局讲解主线:一次线上事故 → 同步灌库的问题 → 任务化设计 → 背压 → 断点续传 → 进度反馈。
P1 · 产出页
中心内容:一个带进度、可中断、可重试的异步灌库任务。
- 讲解技巧
- 开场事故:运营上传 200 个 PDF,Web 线程池被占满,全站问答超时 5 分钟。
- 结论:任何超过 3 秒的活都不该在请求线程里做。
- 时长:20s
P2 · 任务化设计
中心内容:上传即返回任务 ID,后台异步处理。
页面内容:任务状态机(PENDING / RUNNING / SUCCESS / FAILED / CANCELLED)
讲解技巧
- 讲清状态机的价值:用户能看进度、能取消、失败能重试,这三件事是同步做不到的。
- 提醒任务表要记录 processed/total,前端才能画进度条。
时长:5min
P3 · 背压与并发控制
中心内容:并发开太大,Embedding 厂商会限流,整个任务失败。
页面内容:信号量 / 线程池队列 / 限流器
讲解技巧
- 这是本节最实用的经验:并发不是越大越好,Embedding 接口通常有 RPM 限制。
- 给经验值:先用小并发跑,观察 429 错误率,再往上调。
时长:5min
P4 · 断点续传
中心内容:失败任务从断点继续,不从头再来。
页面内容:已处理片段记录;重启后跳过已完成
讲解技巧
- 讲清为什么重要:10 万片段跑到 80% 失败,从头再来意味着重新付 80% 的钱。
- 实现要点:每处理 N 条就更新一次进度,别等全跑完。
时长:5min
P5 · 失败分类处理
中心内容:可重试 vs 不可重试要分开。
页面内容:429/5xx 重试;400 参数错误直接标记失败
讲解技巧
- 强调不可重试的错误要立刻停并报清楚原因,否则会一直重试烧钱。
- 单条文档失败不要中断整批,要记录并继续。
时长:4min
P6 · 编码:任务执行器
中心内容:独立线程池 + 进度持久化 + 优雅停机。
页面内容:IngestTaskExecutor;@PreDestroy 等待在途任务
讲解技巧
- 重点讲优雅停机:服务重启时正在跑的任务怎么办?要等它跑完或标记中断,不能丢状态。
- 提醒不要用
@Async默认线程池,会和业务共用导致互相拖垮。
时长:7min
P7 · 进度反馈体验
中心内容:进度条要真实,别用假动画。
- 讲解技巧
- 产品视角建议:显示「已处理 1200/3000 个片段」比纯百分比更可信。
- 失败要给出可操作的提示(哪个文件、什么原因、怎么重试)。
- 时长:3min
P8 · 避坑与小结
中心内容:异步化之后,观测比同步时更重要。
- 讲解技巧
- 引出下一节:怎么知道系统是变好了还是变差了——02-17 评测体系。
- 时长:2min
讲师备忘
| 项 | 内容 |
|---|---|
| 课前必做 | 准备任务状态机图;准备限流 429 的错误样例 |
| 最容易超时处 | P6 编码,线程池配置容易被展开讨论 |
| 学员最常问 | 「要不要上 MQ?」答:单实例先用线程池+任务表,多实例再上 MQ |
| 现场备用 | 无真实文档 → 用生成的小文件批量模拟 |