Skip to content

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
现场备用无真实文档 → 用生成的小文件批量模拟