发布时间:2026/7/24 1:23:15
我为什么单一消费者的场景下,要用 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 的简单性就是它的优势。为什么不用 StreamRedis Stream 是 Redis 5.0 推出的正经 MQ 数据结构有 ACK、消费者组、pending 列表、消息回溯、断点续消费,那为什么不用因为这些功能项目里已经用MySQL实现了。来看项目实际的任务模型┌─────────────┐ LPUSH ┌──────────────┐ ClaimPendingTask ┌─────────┐ │ Producer │ ───────────────→│ Redis List │←──(KEDA 监控长度)─────│ KEDA │ └─────────────┘ └──────┬───────┘ └────┬────┘ │ BLPOP │ ▼ 扩缩容 │ ┌─────────────┐ ┌──────────────┐ │ │ Consumer │ ──── 查完整数据 →│ MySQL │←──────────────────────────────┘ └─────────────┘ └──────────────┘ACKMySQL 的 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 当队列轮询开销大200 个 worker 每秒SELECT ... WHERE status 0 LIMIT 1这就是 200 QPS 的空查询纯浪费。锁竞争激烈SELECT FOR UPDATE或UPDATE ... WHERE status 0并发一高 MySQL 锁竞争严重吞吐量上不去。KEDA 不认 MySQL 列表长度KEDA 原生支持监控 Redis List 长度做扩缩容MySQL 只能自己写 metrics 接口。BLPOP零浪费阻塞等有消息立刻唤醒没消息就等着零 CPU 消耗。MySQL 轮询做不到这一点。List 当通知DB 当状态机职责承担者为什么任务通知Redis List快、阻塞、零轮询任务状态MySQL事务、持久化、复杂查询可靠性兜底MySQL 定时扫描状态机不丢消息就能补弹性伸缩KEDA Redis List原生支持 List 长度监控代价是什么消息格式自己校验Redis 不关心你塞的字符串是不是合法 JSON应用层json.Unmarshal失败了就丢掉打一行 error log。没有死信队列消息处理失败没有自动重试和转存得自己写逻辑。没有消息回溯想重跑某条历史消息去 MySQL 手动改任务状态。不能广播一条消息只能被一个消费者拿走想多个服务同时收到在业务层再发一条。

相关新闻

2026/7/24 1:18:15

AIGC创作教学新风口!云桌面如何重塑校园实训模式

AIGC技术普及带动数字创作课程落地,院校与职业培训机构普遍遭遇硬件算力不足、实训环境难以统一管控、跨场景学习受限等现实阻碍。云桌面依托云端集中算力池,把AI绘图、数字视频、三维建模等高负载创作程序部署至远端服务器,普通终端设备即可…

2026/7/24 1:18:15

Java开发者转型大模型应用开发的实战指南

1. 从Java工程师到AI开发者的转型之路 三年前,我还在某互联网公司做着传统的Java后端开发,每天和Spring Boot、MySQL、Redis打交道。直到去年公司裁员,我才意识到传统开发岗位的竞争已经白热化。在失业后的三个月里,我完成了从Jav…

2026/7/24 1:18:15

智能体技术解析与开发实战:从原理到部署

1. 智能体(Agent)技术全景解析在大模型技术爆发的2023年,智能体(Agent)已成为AI落地的最重要载体。不同于传统AI系统的被动响应模式,智能体通过自主感知、决策和执行能力,正在重塑人机交互的范式。根据实际项目经验,一个典型的智能…

2026/7/24 2:58:19

AI学术专著生成工具:技术原理与应用实践

1. AI专著生成工具的核心价值与应用场景学术专著写作向来是研究者面临的最大挑战之一。从选题确定到文献综述,从理论构建到实验验证,每个环节都需要投入大量时间精力。传统写作模式下,一本学术专著的完成周期往往以年为单位计算。而AI专著生成…

2026/7/24 2:58:19

应用埋点与告警闭环 —— 从业务异常感知到底层根因

应用埋点与告警闭环 —— 从业务异常感知到底层根因 系列博客第 6 篇(终)。用 Flask Demo 演示 RED 方法埋点,串起"指标 → 告警 → 事件 → 闭环"全链路。 一、应用监控的两种姿势 方式原理适用埋点(Metrics&#xff…

2026/7/24 2:58:19

我与 IT 这三十年:2008,软件开始住进口袋

上一篇写到 2007 年,iPhone 把计算入口从桌面往口袋里拽了一下。但真正让程序员意识到“手机不是一个更小的电脑”,是在 2008 年。 这一年,App Store 上线,第一批原生应用进入 iPhone。几个月后,第一台 Android 手机 …

2026/7/24 2:58:19

中间件监控实战 —— MySQL / Redis / Kafka / ElasticSearch 一网打尽

中间件监控实战 —— MySQL / Redis / Kafka / ElasticSearch 一网打尽 系列博客第 5 篇。四大中间件的黄金指标、Exporter 部署、关键 PromQL、告警规则。 一、MySQL 监控(ecs-0002: 1.94.204.215) 1.1 黄金指标映射 黄金指标MySQL 对应流量QPS&#…

2026/7/24 2:58:19

GPT-6研发暂停:AI模型规模化挑战与开发者技术转向分析

最近AI圈最重磅的消息莫过于OpenAI突然宣布暂停GPT-6的研发工作。作为长期关注AI技术发展的开发者,我第一时间整理了这次事件的技术背景、可能原因以及对开发者社区的实际影响。无论你是AI初学者还是资深工程师,理解这次技术路线的调整都至关重要。1. GP…

2026/7/24 2:53:19

深度学习图像分类技术解析与实践指南

1. 图像分类技术概述图像分类是计算机视觉领域最基础也最重要的任务之一,其核心目标是将输入的图像自动归类到预定义的类别中。这项技术已经广泛应用于医疗诊断、自动驾驶、工业质检等多个领域。在深度学习的推动下,现代图像分类系统已经能够达到甚至超越…

2026/7/23 12:54:51

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述:为什么我们需要一个本地通信服务器?在游戏开发、数字孪生、仿真训练等众多领域,Unity作为强大的实时3D内容创作平台,其核心逻辑通常由C#驱动。然而,当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/24 0:03:10

不同品牌斜齿行星减速机如何替换?以PX与PAG系列为例

不同品牌斜齿行星减速机如何替换?以 PX 与 PAG 系列为例 一、系列对应不等于型号直接互换 PX 与 PAG 都属于斜齿、方法兰、输出轴式精密行星减速机,结构形式和应用方向具有对应关系。 原设备使用PX系列时,可以优先从PAG系列中寻找替换型号。但…

2026/7/24 0:03:10

jdk8 把list 扁平化成String 多个以逗号分隔

在 JDK 8 中&#xff0c;将 List 扁平化为以逗号分隔的 String&#xff0c;有几种非常简洁且高效的方法。&#x1f680; 推荐方案&#xff1a;使用 Collectors.joining()这是最标准的 Java 8 写法&#xff0c;适用于 List<String>。javaimport java.util.stream.Collecto…

2026/7/24 0:03:10

java 两个 long id 怎么合并成一个long id 并且不重复

“把两个 Long ID 合并成一个唯一的 Long ID&#xff0c;且保证不重复”这个需求&#xff0c;在 Java 里直接做数学上的“完美合并”是不可能的。因为两个 Long&#xff08;各 64 位&#xff09;要合并成一个 Long&#xff08;64 位&#xff09;&#xff0c;在信息论上是有损压…

2026/7/23 23:42:43

3个高效策略:快速掌握Axure中文界面配置

3个高效策略&#xff1a;快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…