跳到正文

消费者

消息队列)(Message Consumer

高级通用

消费者(消息队列)(Message Consumer)是从消息队列接收消息并执行后续处理的程序。它让耗时任务不必卡在用户请求里,例如用户上传文件后,由消费者在后台生成预览图。

你可能会说:「用户上传文件后先告诉他上传成功,生成预览图这件事让后台慢慢处理。」

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

动手看看

预览任务上传服务消息队列等待处理消费者等待任务预览图尚未生成
1

文件上传完成后,上传服务只把“生成预览图”这项任务放进队列,不用等预览图做好才结束请求。

要点

  1. 1

    取出消息并执行对应任务

    你可以把一条消息理解成一份待办:文件编号、要做的事等。消费者从队列接收它,再根据内容调用生成预览图的代码。消息负责传递任务信息,真正干活的是消费者。

  2. 2

    处理结果决定后续动作

    生成成功后,消费者通常要向队列确认处理完成;失败时,则按队列和应用的配置重试或记录失败。如果刚收到消息就当作完成,进程中途退出可能让任务没做完却不再被处理。

  3. 3

    重复处理也要纳入设计

    一次任务可能因超时或进程故障再次送到消费者。所以生成预览图时,我们可以用文件编号检查结果是否已存在。这样即使同一条消息被处理两次,也不至于创建两份结果。

容易混淆的地方

消息队列负责暂存和传递消息,消费者负责拿到消息后执行任务;把任务放进队列的那一方是生产者。如果你看到“后台任务”,也别直接等同于消费者:定时任务同样能在后台运行,但它不一定从消息队列接收工作。消费者通常是后台任务的一种实现方式。

什么时候用

适合用

  • 用户提交视频后,页面先返回上传结果,再由消费者接收转码消息,在后台生成可播放的版本。
  • 电商订单创建后,把发送确认邮件的任务交给消费者处理,避免邮件服务响应慢拖住下单请求。
  • AI 工具收到批量文档解析请求后,让消费者逐份处理,并把进度和结果写回数据库。

不适合用

  • 用户点开个人资料页,只需要立即读取并展示数据库里的资料;直接走请求处理即可,不必引入消息队列。
  • 用户修改表单后需要立刻知道字段是否合法;在当前请求中校验并返回错误,比交给消费者更合适。
  • 每天固定时间生成一份报表,且没有任务消息需要接收;先用定时任务触发处理即可。

练一练

你的网站在用户上传图片后生成缩略图。页面已把生成任务放入消息队列,但偶尔出现重复缩略图或任务丢失。你会怎样调整消费者?

让 AI 帮你做

请为图片上传功能实现消息队列消费者:接收包含图片编号的缩略图任务,按编号检查结果是否已存在,生成成功后再确认消息;处理失败时记录错误,并说明当前队列配置下如何重试。不要让上传请求等待缩略图生成。

接下来学什么