Redis Stream 实现 MQ 的可行性
早在 4 年前,当我发现 Redis5 中增加了 Stream 类型后我就觉得它的这些特性完全可以实现一个完整的 MQ 中间件功能,当时我还在交控工作,当时的项目刚好涉及到大量数据入库的一个需求,当时这个项目不算很大,所以我就想把这个新的技术引入到项目中,实现一个轻量级的基于 Redis 的消息队列。
最终基本上实现了这个功能,当时也做了一个基于 SpringBoot 的 Demo ,后来又改了一版基于 Jedis 版本的,因为可以自己定义和操作多线程,更加灵活自由的实现一些细节。
最近提离职后正在交接期,自己的时间比较多,又翻出这个早起的 Demo ,想改造一下,用到我的心情记录员项目中,如果精力和时间有的话我更想将它完善为一个完整的、可复用的项目。
心情记录员小程序为什么要用到这个?以及为什么不用其他成熟的 RabbitMQ ,首先不用其他成熟的原因是我不想搞太多中间件,一个项目中 Redis 安装是大多数情况,因此我想在保持单体应用的基础上实现一个 MQ ,另外的一个原因就是折腾,这也是我本人的一个“缺点”,什么都喜欢自己折腾一下,验证可行性。接下来说说应用场景吧,心情记录员这款小程序目前调用的 AI 是 Kimi 的平台,目前因为是前期,因此是免费版本,并发数限制到了 1 ,这就会导致一个问题,如果同时有两个或者多个(意淫一下,哈哈哈)同时点了记录的时候,这时候有一个肯定会报错,这时候就可以用到消息队列了,将请求的数据先放入队列,等前一个 AI 生成结束后再次调用,就这?……,一个队列不就搞定了吗?当然还有场景了,那就是目前 AI 生成我采用的是 Stream 流式返回,而我是在点击记录后就开始生成,点击记录后会跳转到结果页面,为了使用户跳过去立马就感觉到在生成,因此我就将调用 AI 接口的动作提前到跳转页面前点击记录按钮后,然后给一定到 Loading 延迟在跳转,跳转到结果页后建立 WebSocket 连接,根据 openId 标识接收消息,这时候这个消息其实已经在上一步中在生成了,这里就可以用到消息队列了,根据对应的 openId 到消息队列中取内容,服务端的 WebSocket 只需要根据标识从消息队列中缓存的生成结果进行返回即可,提升了响应速度。
大概流程就像下图这样:
4 年前这个项目的库和博客:
Gitee-redismq (原谅我以前使用 Gitee 的行为,哈哈哈)
CSDN 博客(如果对 CSDN 排斥可以访问下面我自己网站的文章)
个人网站文章地址
我的评价是,专业的事交给专业的中间件去做
可以用、不好用、没必要
可以 但没必要
如果为了部署架构简单,而选择用软件 A 做 功能 B 的事,那我可能会更倾向于 everything in PostgreSQL 😄
交控,大量数据入库
是不是 mqtt+时序数据库好点?
不是,你说的这个是信号系统里面的,当时其他项目组这个方面是用 C++开发的,我这个是工程数据 Excel 数据例如电子地图、各种其他表:VOBC 、联锁表等等,当时的这个数据平台设计的时候我才用了精确到单元格级别的存储,方便后面功能的扩展,所以数据量比较大,一个一个工程线路下来有一百万左右的数据入库
我现在就在用 RedisSteam 用来做简单的 MQ
个人觉得 list 的 right push + left pop 更靠谱
大哥,RedisSteam 用来做简单的 MQ 和 redis list 如何更好的区别应用场景呢??
可以,我就这么用过,而且看场景可能是完全是有必要的,说白了一切看需求和成本,尤其是给多个 B 端客户在硬件有限但是流量不小的交付场景,说“没必要”,“everything”就是项目做的少
去年,我们也用 redis stream 做的 mq
stream 有 maxlen 可以控制容量,如果你不希望消费比生产慢把内存爆掉的话
嗯嗯,这个 Demo 刚写完时就有一个老哥咨询,他最终是用到了他们网站短信发送功能了,用 Redis Stream 做的消息队列,性能还可以
如果消息量很少没事,量大上 kafka ,几十亿几百亿消息
嗯嗯,是的,这种只适合轻量应用,如果数据量那么大的话就不需要在乎多加额外中间件成文的问题了
#15 并不见得是这样,kafka 需要落盘和不平衡同样会带来让人头疼的问题,单技术维度思考会带来很严重的后果
#15 实际上我们当时 Redis 和 Kafka 两个都上了,Redis 的原因是吞吐,限流,Kafka 是为了落盘持久化,而且硬盘的总 IO 有限,都留给 Kafka 了
#17 那是没设计好,涉及分布式大数据不管啥组件都需要考虑这些问题。这种情况还用 redis 直接爆内存直接不可用
可以,也可以用这个代替 redis 。 nats.io
确实,业务场景的复杂程度也决定了重要的一环
#18 张嘴就来分布式大数据高可用?做 waf 防应用层攻击的时候给你额外落盘处理的时间?爆内存就加内存,redis stream 文档里的的 maxlen 参数看过吗? kafka 不均衡爆盘是不是只会找运维?一再说看需求看成本,你要是拿着八股文 chatgpt 干得更好
我的评价是,专业的事交给专业的中间件去做
我们用 redis stream 好几年了,每天五六十亿数据是有的,我们业务对数据不敏感,数据差异小范围都可以接受,实际用起来也没发现多大差异,从成本上来看对比 kafka 便宜太多
#20 打个比方说,小公司给客户交付的一台服务器连软件开发加硬件就五万块,你得算计硬盘多少钱,内存多大多少钱,是雇个光会打嘴炮懂个半吊子 MQ 的,还是 redis 和应用层能一把抓的,这种事情很要命,直接决定生死,但是大公司是另一回事,有专门的维护每个中间件的工程师(是不是真熟悉底层另一说),成本收不收回来那也是商业策略问题和员工没关系
专业的事交给专业的中间件去做 可以使用 kafka rabbitmq
#21 你张嘴就拿 WAF 和实时性说事,Redis Stream 的吞吐和 maxlen 能撑小规模没错,但消息量一上来,内存爆炸是你加内存就能随便解决的? Kafka 不均衡、落盘慢是设计没做好,你拿运维当挡箭牌,原帖想做“完整项目”,扩展性是以后要考虑的事情,
更何况我提 Kafka 是给选项,你扣个八股文帽子以为自己懂需求懂成本?技术选型不是靠意气用事,Redis 做大数据场景就是自欺欺人,而且我也没让楼主这种小场景上 kafka ,这点数量级不用 redis 直接进程内异步处理都行,你非要瞎杠
最近有位站长在用我们WebIM客户端的时候,无法登录我们的WebIM服务器,十分惊讶。 在我们的用户里尚属首例,其实更惊讶的是我的CentOS也遇到了同样的问题。然后分析了这位…
入手了 wtr pro n100 ,配了 8g 内存,机子刚到货,正在犹豫怎么设计系统架构。本人有 linux 基础,玩好几年 vps 了,也熟悉 docker ,内网穿透可以…
平时做的项目都比较小,一般都是几台应用服务器+几台数据库服务器,虽然也有数据库拆分,但基本上都是把不同业务的表放在不同库中,比如一个 erp 系统,将财务相关的表放在某台服务器…