前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Node.js驱动Redis,实现一个消息队列!

使用Node.js驱动Redis,实现一个消息队列!

作者头像
Peter谭金杰
发布2020-06-18 17:43:45
2K0
发布2020-06-18 17:43:45
举报
写在开头
  • 最近的Devops和微前端已经写得差不多,开始复习下后端相关知识,之前想写的这篇文章,终于落地
  • 如果你想加入前端交流群,可以文末联系我加入
正式开始
  • 电脑环境 推荐Mac|Linux
  • 安装redis,并且启动redis
代码语言:javascript
复制
`redis-server` 
  • 启动成功后会如下所示:
  • redis默认端口6379
开始写Node.js代码
  • 下载redis这个库
代码语言:javascript
复制
yarn add redis --save
  • 使用Node.js连接redis
代码语言:javascript
复制
const redis = require('redis');

const client = redis.createClient(6379, '127.0.0.1'); 
  • 由于是消息队列,于是需要有一个生产者、消费者

❝这里普及下消息队列的使用,跟redis一样,都是属于进程外的服务,就是单独要占用一个端口起服务的 ❞

什么是消息队列?
  • “消息队列”是在消息的传输过程中保存消息的容器。
  • 消息被发送到队列中。“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。
  • 即有生产者,消费者,发布订阅模式实现
消息队列使用场景
  • 业务解耦
  • 异步处理提升性能
  • 限流削峰(降低成本,不可能按流量最高峰去配备服务器)
开始实现
  • 生产者
代码语言:javascript
复制
`const redis = require('redis');

const client = 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('message', 'hi! message!');
});` 
  • 生产者对特定的channel进行publish,并且附带参数
  • 消费者订阅特定的channel,消费,并且获取数据
代码语言:javascript
复制
`const client = 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('subscribe channel:' + channel + ', count:' + count);
});
client.on('message', function (channel, message) {
  console.log('message channel:' + channel + ', msg:' + message);
});
client.on('unsubscribe', function (channel, count) {
  console.log('unsubscribe channel:' + channel + ', count:' + count);
});` 
  • 结果:
  • 我订阅了testsecoud和message两个通道,于是触发了subscribe事件两次,符合预期
模拟场景,生产者不断提供生产
  • 加入定时器
代码语言:javascript
复制
`const redis = require('redis');

const client = 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);
});` 
  • 此时消费者不断打印,触发了message事件

❝这样,我们使用redis发布订阅模式,实现了简单的消息队列 ❞

实现流量削峰,限流
  • 目前我们生产是1S一条消息,但是我想控制成2S消费一次,可以吗?
  • 我们控制下消费频率,首先不改变生产频率
代码语言:javascript
复制
`const client = require('redis').createClient(6379, '127.0.0.1');
const ArrayList = [];
client.on('error', function (err) {
  console.log('err' + err);
});
client.subscribe('testSecond');
client.subscribe('message');
client.on('subscribe', function (channel, count) {
  console.log('subscribe channel:' + 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(()=>{
    console.log(ArrayList,'ArrayList')
},2000)` 
  • 每2S读取一次队列的数据
  • 模拟的跟实际有什么不一样?
    • 模拟的是在一个进程端口内,属于进程内缓存
    • 真实的是可以通过回复ACK确认消费,独占一个端口进程,属于进程外缓存
一个简单的通过redis实现消息队列就完成了
  • 源码地址:https://github.com/JinJieTan/MQ
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在开头
  • 正式开始
  • 开始写Node.js代码
  • 什么是消息队列?
  • 消息队列使用场景
  • 开始实现
  • 模拟场景,生产者不断提供生产
  • 实现流量削峰,限流
  • 一个简单的通过redis实现消息队列就完成了
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档