跳到正文

入队

Enqueue

高级通用

入队(Enqueue)是把一项待处理任务或消息放进队列,等消费者稍后取出处理。它让接收请求和执行耗时工作分开:例如用户上传视频后,网站先把转码任务入队,再由后台处理。

你可能会说:「用户上传视频后,页面先告诉他已收到,转码交给后台慢慢做,别让他一直等。」

读之前建议先了解(这是一个高级概念)

动手看看

上传视频上传页面网站服务任务队列转码程序
1

用户点击上传,页面把视频交给网站服务。转码比较耗时,不适合让这次请求一直等着。

要点

  1. 1

    放进去的是待处理的消息

    你把转码任务入队时,放进去的通常是视频 ID、任务类型等处理所需的信息,而不是在这一步完成转码。这样消费者拿到消息后,才知道要处理哪个视频。

  2. 2

    入队成功不等于任务完成

    接口返回“任务已接收”,只说明任务进入了后续处理流程,不能告诉用户“转码完成”。因为消费者还可能排队、执行失败,所以产品里最好把处理中、完成和失败分开显示。

  3. 3

    先想清楚重复提交怎么办

    用户连点两次,或接口超时后重试,都可能让同一任务入队多次。你可以给任务一个业务标识,并让后续处理能识别重复请求,这样才不容易重复发通知或重复扣费。

容易混淆的地方

入队是“把待处理事项交给队列”,不是“已经把事做完”;真正执行工作的是后续取到消息的消费者。它也不等于写入数据库:数据库写入侧重保存数据,入队侧重安排后续处理。一个流程可以两者都做,比如先保存上传记录,再把转码任务入队。

什么时候用

适合用

  • 用户上传视频后要转码:先返回任务已接收,再让后台消费者处理视频。
  • 后台批量导入商品时,每个文件需要花时间解析,先入队再展示处理进度。
  • AI 工具生成长报告可能耗时较久,先将生成任务入队,让用户稍后查看结果。

不适合用

  • 登录时要立刻验证密码并决定能否进入页面,这一步直接处理并返回结果更合适。
  • 用户只是在设置页修改昵称,保存后立即读取即可;直接写数据库,不必为这次修改建队列。
  • 表单输入时要即时提示邮箱格式是否正确,在前端校验即可,不需要把每次输入入队。

练一练

你在做视频上传网站。转码通常要花几分钟,用户上传完成后希望立刻离开页面,之后再查看结果。接口接到上传请求后,哪种做法最符合“入队”?

让 AI 帮你做

请为视频上传接口设计转码任务入队流程:上传记录保存后返回任务 ID 和“处理中”状态,由消费者执行转码并更新结果。说明入队成功与转码完成如何区分,以及重复提交时如何避免重复处理。

接下来学什么