跳到正文

后台任务

Background Job

中级通用

后台任务(Background Job)是由服务端在请求之外继续执行的一项工作。它让耗时操作不必占着用户的请求等待,例如用户提交视频后先收到受理结果,转码完成后再查看成品。

你可能会说:「用户上传视频后,能不能先告诉他已收到,转码好了再让他查看结果?」

读之前建议先了解

动手看看

上传视频用户服务端接收视频任务队列转码任务
1

用户提交视频,服务端先接收文件,不在这次请求里等转码完成。

要点

  1. 1

    先接收请求,再交出任务

    你提交视频时,接口可以先保存文件和任务记录,再返回任务编号。这样页面不用等转码结束;但“已受理”只说明工作接下来了,不代表成品已经生成。

  2. 2

    由服务端另行执行工作

    后台任务会在请求返回后继续运行,可以交给同一服务中的任务执行器,也可以交给独立的工作进程。任务量变大时,我们常用队列传递任务,让执行速度不必跟提交速度完全一致。

  3. 3

    把结果和失败留给后续查询

    因为用户不会一直等着原请求,系统需要记录等待中、处理中、成功或失败等状态,并提供查询或通知方式。失败后若要重试,还得考虑同一任务执行两次会不会重复扣费、重复发信。

容易混淆的地方

后台任务说的是“请求之外继续做的工作”,消息队列是传递和缓冲任务的一种工具,不是每个后台任务都得用队列。定时任务则强调“到某个时间再启动”;它启动后做的事可以是后台任务,但用户刚提交视频就开始转码,不需要等定时器。

什么时候用

适合用

  • 用户上传视频后要转码并生成预览图,页面先显示处理中,完成后再展示可播放版本。
  • 管理员导出大量订单时,先创建导出任务,生成文件后再通知管理员下载。
  • AI 工具生成较长的报告时,先保存请求并返回任务编号,让用户稍后查看结果。

不适合用

  • 用户打开个人资料页,只需读取少量现成数据并立即展示;直接通过接口返回结果更简单。
  • 用户提交表单后必须立刻知道字段是否有效;在请求中完成校验并返回错误,而不是交给后台任务。
  • 只想让浏览器里的菜单稍后展开,不涉及服务端持续工作;用前端定时器或交互状态处理。

练一练

你在做订单导出功能,生成文件通常比一次页面请求等得久。用户还需要知道导出是否成功。你会怎么设计?

让 AI 帮你做

请把订单导出实现为后台任务:接口接收请求后返回任务编号,服务端继续生成文件,并保存可查询的任务状态、下载地址或失败原因。请说明任务失败如何处理,以及重试时如何避免重复生成或重复通知。

接下来学什么