消费者
消息队列)(Message Consumer
高级通用消费者(消息队列)(Message Consumer)是从消息队列接收消息并执行后续处理的程序。它让耗时任务不必卡在用户请求里,例如用户上传文件后,由消费者在后台生成预览图。
你可能会说:「用户上传文件后先告诉他上传成功,生成预览图这件事让后台慢慢处理。」
动手看看上传文件后生成预览图
1
文件上传完成后,上传服务只把“生成预览图”这项任务放进队列,不用等预览图做好才结束请求。
要点消费者收到消息后会做什么?
- 1
取出消息并执行对应任务
你可以把一条消息理解成一份待办:文件编号、要做的事等。消费者从队列接收它,再根据内容调用生成预览图的代码。消息负责传递任务信息,真正干活的是消费者。
- 2
处理结果决定后续动作
生成成功后,消费者通常要向队列确认处理完成;失败时,则按队列和应用的配置重试或记录失败。如果刚收到消息就当作完成,进程中途退出可能让任务没做完却不再被处理。
- 3
重复处理也要纳入设计
一次任务可能因超时或进程故障再次送到消费者。所以生成预览图时,我们可以用文件编号检查结果是否已存在。这样即使同一条消息被处理两次,也不至于创建两份结果。
容易混淆的地方
消息队列负责暂存和传递消息,消费者负责拿到消息后执行任务;把任务放进队列的那一方是生产者。如果你看到“后台任务”,也别直接等同于消费者:定时任务同样能在后台运行,但它不一定从消息队列接收工作。消费者通常是后台任务的一种实现方式。
什么时候用
适合用
- 用户提交视频后,页面先返回上传结果,再由消费者接收转码消息,在后台生成可播放的版本。
- 电商订单创建后,把发送确认邮件的任务交给消费者处理,避免邮件服务响应慢拖住下单请求。
- AI 工具收到批量文档解析请求后,让消费者逐份处理,并把进度和结果写回数据库。
不适合用
- 用户点开个人资料页,只需要立即读取并展示数据库里的资料;直接走请求处理即可,不必引入消息队列。
- 用户修改表单后需要立刻知道字段是否合法;在当前请求中校验并返回错误,比交给消费者更合适。
- 每天固定时间生成一份报表,且没有任务消息需要接收;先用定时任务触发处理即可。
练一练选一个答案,看看解释
你的网站在用户上传图片后生成缩略图。页面已把生成任务放入消息队列,但偶尔出现重复缩略图或任务丢失。你会怎样调整消费者?
让 AI 帮你做复制给 AI Agent 直接用
请为图片上传功能实现消息队列消费者:接收包含图片编号的缩略图任务,按编号检查结果是否已存在,生成成功后再确认消息;处理失败时记录错误,并说明当前队列配置下如何重试。不要让上传请求等待缩略图生成。