用Redis发布订阅搞高并发,感觉挺复杂但又不得不试试看怎么撑住流量
- 问答
- 2025-12-24 11:43:08
- 4
综合自多位开发者社区论坛、博客园技术博文及知乎上关于高并发实战的讨论)
“用Redis的发布订阅(Pub/Sub)来扛高并发,这事儿听起来就让人有点头大,但又确实是不少团队在特定场景下会被逼着去尝试的一条路,为啥说头大呢?因为这东西它不像用Redis简单做个缓存那么直白,搞不好消息就丢了,或者积压了,或者消费者撑不住了,各种幺蛾子,但为啥又不得不试试呢?往往是遇到了那种实时性要求高、流量瞬间暴涨、用常规队列感觉有点笨重或者延迟不够低的场景。
先得搞清楚Redis Pub/Sub是个啥玩意儿,简单打个比方,它就像个电台广播,有人(发布者)在一个频道(channel)上喊一嗓子(发布消息),所有当时正在听这个频道的人(订阅者)都能同时听到,这是一种典型的广播模式,它本身是不持久化的,这意味着如果消息发布的时候,某个订阅者不在线(比如网络断了或者服务重启了),那对不起,这条消息它就永远错过了,电台不会为你重播,这一点是跟RabbitMQ、Kafka这类专业消息队列最核心的区别之一,也是复杂性的主要来源。

那为啥还要考虑用它来撑高并发呢?Redis本身就以速度著称,基于内存操作,Pub/Sub机制也非常轻量,在消息瞬间洪峰到来时,它的吞吐能力可以非常惊人,延迟极低,有些开发者分享的经验里提到,在配置得当、网络环境良好的情况下,每秒处理几十万甚至上百万条简单的消息发布订阅也不是不可能,这对于一些对实时性要求极高的场景,比如直播间的弹幕、大型在线游戏的实时状态同步、金融市场的实时价格推送,吸引力是很大的,这些场景下,丢几条弹幕可能问题不大,但延迟几百毫秒用户就要骂娘了。
但光看到高吞吐和低延迟就冲上去用,很容易掉坑里,最大的坑就是前面说的消息丢失问题,因为Pub/Sub不持久化,所以它天然不适合用来处理重要的、不能丢的业务逻辑,比如扣减库存、生成订单,你总不能说用户下单了,但刚好你的订单服务重启了一下,这个订单消息就没了吧?通常用它来处理的,是那种‘锦上添花’的、丢了也能忍受的实时信息,或者即使丢了也能从其他途径恢复的数据。

另一个坑是消费者负载问题,因为是广播,一个频道有多少个订阅者,发布一条消息Redis服务器就要推送多少次,如果订阅者非常多,比如有上万个客户端连接着,那么发布一条消息就会对Redis服务器造成上万个写的压力,这可能会成为瓶颈,甚至拖垮Redis,它比较适合订阅者数量相对可控的场景,比如后端的不同服务模块之间通信,而不是直接面对海量的前端客户端。
那怎么才能尽量‘撑住’流量,让这个方案变得可行呢?论坛里的老手们分享了一些土办法和结合策略:

-
频道设计要巧妙:别把所有消息都往一个频道上扔,可以根据业务维度拆分频道,比如按直播间ID分、按地域分、按消息类型分,这样可以把大流量分散到不同的频道上,减少单个频道的压力,也方便消费者按需订阅,避免处理不关心的数据。
-
消费者要健壮:订阅消息的客户端代码必须有很好的重连机制,因为网络是不稳定的,一旦断线要能自动重连并重新订阅,消费者的处理逻辑一定要快,不能是耗时的操作,如果处理一条消息要1秒钟,那每秒来一万条消息你就完蛋了,理想情况是,消费者只做最核心的逻辑,或者快速地把消息转移到另一个更可靠、更适合做复杂处理的系统(比如本地内存队列或者数据库)中去。
-
结合其他技术混用:这是比较常见的做法,用Pub/Sub来做实时触发的信号灯,当有重要事件发生时,通过Pub/Sub快速通知所有相关服务‘有事情发生了!’,然后这些服务接到通知后,再去一个持久化的消息队列(比如Redis的Stream数据结构,或者Kafka)里拉取详细的任务数据进行处理,这样既利用了Pub/Sub的低延迟,又通过持久化队列保证了消息不丢失,也有开发者提到,可以在发布消息的同时,将最新的一份状态或快照存入一个普通的Redis键值对中,供后连上来的订阅者先获取一个基准状态,再通过后续的Pub/Sub消息进行增量更新,这是一种弥补无持久化缺点的思路。
-
监控和降级:既然用了这么‘脆弱’的机制,监控必须到位,要密切关注Redis的内存、连接数、网络带宽,以及消费者的消息积压情况(虽然Pub/Sub本身不提供积压统计,但可以通过其他方式估算),一定要设计降级方案,比如当检测到Redis压力过大时,自动切换成轮询模式,虽然实时性差了,但至少服务不会完全崩溃。
用Redis Pub/Sub搞高并发,就像在开一辆没有备胎的跑车,速度是快,但你得非常小心路况,并且心里要时刻想着万一爆胎了怎么办,它不是一个放之四海而皆准的银弹,而是在特定约束条件下(实时性极高、可容忍少量丢失、订阅者不多)的一种权衡和妥协,直接硬上肯定会问题百出,但如果你真正理解了它的脾气,并且围绕它的优缺点做好架构上的补偿和防护,那么在应对某些极端流量场景时,它确实有可能成为帮你‘撑过去’的那根关键稻草,很多团队的成功案例,背后都是这种精细的设计和踩坑经验堆出来的,绝不是简单地调个库就完事了。”
本文由黎家于2025-12-24发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/67526.html
