写在开头。最近的DevOps和微前端都写的差不多了。我开始复习后端相关知识。之前想写的文章终于落地了。如果想加入前端交流群,可以在文末联系我加入正式启动电脑环境推荐Mac|Linux安装redis,启动redis`redis-server`。启动成功后如下:redis默认端口6379,开始写Node.js代码,下载redis库yarnaddredis--saveuseNode.jsconnectionredisconstredis=require('redis');constclient=redis.createClient(6379,'127.0.0.1');既然是消息队列,就需要有生产者和消费者?这里普及下消息队列的使用,跟redis一样,都是进程外服务,也就是需要占用单个端口来启动服务?什么是消息队列?“消息队列”是在传输过程中保存消息的容器。消息被发送到队列。“消息队列”是在传输过程中保存消息的容器。消息队列管理器充当中间人,将消息从源转发到目的地。队列的主要目的是提供路由和保证消息的传递;如果在发送消息时收件人不可用,则消息队列会保留该消息,直到它可以成功传递为止。即有生产者,有消费者,有发布订阅模式实现消息队列使用场景业务解耦异步处理提高性能限流调峰(为了降低成本不可能按照最高流量峰值配置服务器)开始实施生产者constredis=require('redis');constclient=redis.createClient(6379,'127.0.0.1');client.on('error',function(err){console.log('err'+err);});client.on('ready',function(){client.publish('testFirst','hi!first!');client.publish('testSecond','hi!second!');client.publish('消息','嗨!消息!');});`生产者发布到特定频道,消费者带参数订阅特定频道,消费,获取数据`constclient=require('redis').createClient(6379,'127.0.0.1');client.on('error',function(err){console.log('err'+err);});client.subscribe('testSecond');client.subscribe('message');client.on('subscribe',function(channel,count){console.log('订阅频道:'+channel+',count:'+count);});client.on('message',function(channel,message){console.log('消息频道:'+channel+',msg:'+message);});client.on('取消订阅',function(channel,count){console.log('取消订阅频道l:'+channel+',count:'+count);});`结果:我订阅了testsecoud和message这两个频道,所以触发了两次subscribe事件,满足预期的模拟场景,producer继续提供生产加入定时器`constredis=require('redis');constclient=redis.createClient(6379,'127.0.0.1');client.on('error',function(err){console.log('err'+err);});client.on('ready',function(){setInterval(()=>{client.publish('testSecond','hi!second!');client.publish('message','hi!message!');},1000);});`这时候消费者不断打印,触发消息事件?这样,我们使用redis的发布订阅模式,实现一个简单的消息队列?实现流量调峰,限制在现在,我们在1S生产一条消息,但是我想控制它在2S消费,可以吗?我们控制消费频率,首先不改变生产频率`constclient=require('redis').createClient(6379,'127.0.0.1');constArrayList=[];client.on('error',function(err){console.log('err'+err);});client.subscribe('testSecond');client.subscribe('message');client.on('subscribe',function(channel,count){console.log('订阅频道:'+channel+',count:'+count);});client.on('message',function(channel,message){ArrayList.push({channel,message});});client.on('unsubscribe',function(channel,count){console.log('channel:'+channel+',count:'+count);});setInterval(()=>{控制台。log(ArrayList,'ArrayList')},2000)`每2S读取一次队列的模拟和实际数据有区别吗?模拟在进程端口,属于进程内缓存。真正的可以通过回复ACK确认消费,独占一个端口进程,属于进程外缓存。一个通过redis实现消息队列的简单实现就完成了。源码地址:https://github.com/JinJieTan/MQ
