当前位置: 首页 > news >正文

我为什么单一消费者的场景下,要用 Redis List 当消息队列?

我为什么单一消费者的场景下,要用 Redis List 当消息队列?

List 做队列,到底有多简单?

Redis List 是一个双向链表,做队列只需要两个命令:

# 生产者入队LPUSH auto_material_tasks'{"task_id": 206}'# 消费者阻塞出队BLPOP auto_material_tasks30

没有 consumer group、没有 ACK、没有 pending、没有 offset。

消息格式就一条 JSON,里面只放一个task_id,消费者拿到 ID 后去 MySQL 查完整数据。

Redis 不存业务状态,只做"通知"这一件事。

在单一消费者的场景下,List 的简单性就是它的优势。

为什么不用 Stream?

Redis Stream 是 Redis 5.0 推出的正经 MQ 数据结构,有 ACK、消费者组、pending 列表、消息回溯、断点续消费,那为什么不用?

因为这些功能,项目里已经用MySQL实现了。

来看项目实际的任务模型:

┌─────────────┐ LPUSH ┌──────────────┐ ClaimPendingTask ┌─────────┐ │ Producer │ ───────────────→│ Redis List │←──(KEDA 监控长度)─────│ KEDA │ └─────────────┘ └──────┬───────┘ └────┬────┘ │ BLPOP │ ▼ 扩缩容 │ ┌─────────────┐ ┌──────────────┐ │ │ Consumer │ ──── 查完整数据 →│ MySQL │←──────────────────────────────┘ └─────────────┘ └──────────────┘

ACK?MySQL 的 CAS 认领已经做了

每个 worker 拿到的不是一个消息,而是去 MySQL 执行ClaimPendingTask,这条 SQL 用UPDATE ... WHERE status = 0做乐观锁认领任务。

谁 update 到的行数 > 0,谁就"拿了锁",其他 worker 自动跳过。

这本身就是 ACK 机制:认领成功 = 确认消费,不需要 Redis 再来一套 XACK。

消费者组?KEDA ScaledJob 一任务一进程

Stream 的消费者组解决的是"同一队列多个消费者如何分配消息"的问题。

本项目的消费者模型是 KEDA 监测 Redis List 长度,动态创建 K8s Job。

每个 Job 是一个独立进程,跑完就销毁。

不存在"多进程争抢同一个队列"的场景,伸缩的单位是进程,不是线程。

消息丢了?RetryScanOnce 定时扫描兜底

List 最大的硬伤是BLPOP弹出即删,消费者崩了消息就没了。

在项目里有个定时任务RetryScanOnce,每隔一段时间就去 MySQL 扫描超时未完成的任务,重新塞回队列。

消息可靠性的兜底在 MySQL,不在 Redis

Redis 丢消息可以容忍,因为 MySQL 里的状态没丢。

消息回溯? 有Mysql任务表

Stream 支持根据消息 ID 回溯历史消息。

在项目里,队列消息体就一个{"task_id": 206},没有任何需要回溯的业务数据。

真要排查,去 MySQL 查任务表,完整的状态变更历史全在那。

为什么不用 MySQL 当队列?

  1. 轮询开销大:200 个 worker 每秒SELECT ... WHERE status = 0 LIMIT 1,这就是 200 QPS 的空查询,纯浪费。
  2. 锁竞争激烈SELECT FOR UPDATEUPDATE ... WHERE status = 0,并发一高 MySQL 锁竞争严重,吞吐量上不去。
  3. KEDA 不认 MySQL 列表长度:KEDA 原生支持监控 Redis List 长度做扩缩容,MySQL 只能自己写 metrics 接口。
  4. BLPOP零浪费:阻塞等,有消息立刻唤醒,没消息就等着,零 CPU 消耗。MySQL 轮询做不到这一点。

List 当通知,DB 当状态机

职责承担者为什么
任务通知Redis List快、阻塞、零轮询
任务状态MySQL事务、持久化、复杂查询
可靠性兜底MySQL + 定时扫描状态机不丢,消息就能补
弹性伸缩KEDA + Redis List原生支持 List 长度监控

代价是什么?

  • 消息格式自己校验:Redis 不关心你塞的字符串是不是合法 JSON,应用层json.Unmarshal失败了就丢掉,打一行 error log。
  • 没有死信队列:消息处理失败没有自动重试和转存,得自己写逻辑。
  • 没有消息回溯:想重跑某条历史消息?去 MySQL 手动改任务状态。
  • 不能广播:一条消息只能被一个消费者拿走,想多个服务同时收到?在业务层再发一条。
http://www.jsqmd.com/news/1251251/

相关文章:

  • AI绘图效果不佳?掌握精准prompt技巧提升生成质量
  • 深入解析MSPM0 DMA控制器:从基础概念到高级应用实践
  • 从美术到技术:PBR材质核心原理与Blender/Unity实战指南
  • 集合详解(五):集合嵌套与Collections工具类
  • 灵活用工平台行业豆包推广公司联系方式GEGEO.CN - 品牌深度评测
  • AI公司为何抢购旧书?高质量训练数据对抗AI污染的关键
  • 知识城全屋定制哪家好:派福装饰首选品牌 - MXyuyu
  • 全球一体机电脑代工专业服务商排行及实力解析 - 起跑123
  • 大模型部署实战:从蒸馏技术到完整工程生态的VRAM优化方案
  • AI技术如何革新MV制作流程与降低成本
  • 数字音乐观察:《不管你在哪》的搜索入口
  • 2026年7月天津华硕笔记本售后怎么联系|华硕笔记本配件适配查询、省内网点与送检准备 - 笔记本专业售后
  • 2026年郑州首饰黄金回收公司哪家强 靠谱机构挑选参考指南 - 品牌优推
  • 怎么去除抖音视频的水印和文字?2026合法方法、侵权后果与合规工具解析 - 耶斯去水印
  • AI生成内容检测与改写技术解析
  • 小红书无水印保存图片教程:2026手机去水印不用第三方软件方法 - 耶斯去水印
  • 2026年全球专业一体机电脑代工公司实力排行 - 起跑123
  • Codex 修改接口后前端全报错?接口契约与兼容性检查不能少
  • 【OpenHarmony/HarmonyOS】ArkUI 多语言与设置中心:资源限定词、PersistentStorage 和运行时切换
  • 2026年选择手糊混胶机厂家品牌的实用技术参考指南 - 品牌优推
  • AI漫画创作:Coze平台助力育儿内容高效生成
  • Agentic AI提示工程:构建自主进化的智能系统
  • 新手做抖音小店一件代发副业怎么起步?合规高效运营工具选择攻略 - 抖掌柜
  • 2026年7月天津戴森扫地机授权维修服务指南|戴森V系列电池检测、全省门店、原装配件与质保 - 售后数码产品专业
  • 工业场景下挑选模具干冰清洗设备公司品牌实用攻略 - 品牌优推
  • 深入解析ADS7851EVM-PDK:高精度SAR ADC评估与设计实践
  • AI短剧生成平台核心技术解析与应用实践
  • 化工设备行业豆包推广公司联系方式GEGEO.CN - 品牌深度评测
  • 【OpenHarmony/HarmonyOS】游戏启动与隐私合规设计:本地用户、协议勾选和应用内 WebView
  • 即梦怎么去除水印?2026即梦AI生成视频水印去除教程与即梦去除水印方法实测 - 耶斯去水印