后台任务
Background Job
中级通用后台任务(Background Job)是由服务端在请求之外继续执行的一项工作。它让耗时操作不必占着用户的请求等待,例如用户提交视频后先收到受理结果,转码完成后再查看成品。
你可能会说:「用户上传视频后,能不能先告诉他已收到,转码好了再让他查看结果?」
读之前建议先了解
动手看看上传视频后等待转码
1
用户提交视频,服务端先接收文件,不在这次请求里等转码完成。
要点一次后台任务是怎么跑起来的?
- 1
先接收请求,再交出任务
你提交视频时,接口可以先保存文件和任务记录,再返回任务编号。这样页面不用等转码结束;但“已受理”只说明工作接下来了,不代表成品已经生成。
- 2
由服务端另行执行工作
后台任务会在请求返回后继续运行,可以交给同一服务中的任务执行器,也可以交给独立的工作进程。任务量变大时,我们常用队列传递任务,让执行速度不必跟提交速度完全一致。
- 3
把结果和失败留给后续查询
因为用户不会一直等着原请求,系统需要记录等待中、处理中、成功或失败等状态,并提供查询或通知方式。失败后若要重试,还得考虑同一任务执行两次会不会重复扣费、重复发信。
容易混淆的地方
后台任务说的是“请求之外继续做的工作”,消息队列是传递和缓冲任务的一种工具,不是每个后台任务都得用队列。定时任务则强调“到某个时间再启动”;它启动后做的事可以是后台任务,但用户刚提交视频就开始转码,不需要等定时器。
什么时候用
适合用
- 用户上传视频后要转码并生成预览图,页面先显示处理中,完成后再展示可播放版本。
- 管理员导出大量订单时,先创建导出任务,生成文件后再通知管理员下载。
- AI 工具生成较长的报告时,先保存请求并返回任务编号,让用户稍后查看结果。
不适合用
- 用户打开个人资料页,只需读取少量现成数据并立即展示;直接通过接口返回结果更简单。
- 用户提交表单后必须立刻知道字段是否有效;在请求中完成校验并返回错误,而不是交给后台任务。
- 只想让浏览器里的菜单稍后展开,不涉及服务端持续工作;用前端定时器或交互状态处理。
练一练选一个答案,看看解释
你在做订单导出功能,生成文件通常比一次页面请求等得久。用户还需要知道导出是否成功。你会怎么设计?
让 AI 帮你做复制给 AI Agent 直接用
请把订单导出实现为后台任务:接口接收请求后返回任务编号,服务端继续生成文件,并保存可查询的任务状态、下载地址或失败原因。请说明任务失败如何处理,以及重试时如何避免重复生成或重复通知。