首页 > IT职业 > IT职场 > 架构设计之NodeJS操作消息队列RabbitMQ
一. 什么是消息队列?消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。 消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。 二. 常用的消息队列有哪些?RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq。 甚至现在部分NoSQL也可做消息队列,如Redis。 三. 消息队列的使用场景?
四. 使用案例上规模的公司都会有自己的日志分析系统,日志系统是怎么实现的呢?
图解:用户在访问应用的时候,我们要记录下用户的操作记录和系统的异常日志,常规的做法是将系统产生的日志保存到服务器磁盘,在服务器中开启定时任务,定时将磁盘的日志信息传入mq中(生产者),也定时将mq中的消息取出并存到相应的数据库,如ElasticSearch或Hive中。 五. 如何安装RabbitMQ?上面的案例介绍了MQ的一个使用场景,我这里是用RabbitMQ举例,现实项目中可能用到的是Kafka。
网上可以找到好几个相应的Node SDK,这里推荐amqplib 1. 生产者 /**
* 对RabbitMQ的封装 */let amqp = require('amqplib');
class RabbitMQ {
constructor() { this.hosts = []; this.index = 0; this.length = this.hosts.length; this.open = amqp.connect(this.hosts[this.index]);
}
sendQueueMsg(queueName, msg, errCallBack) {
let self = this;
self.open
.then(function (conn) { return conn.createChannel();
})
.then(function (channel) { return channel.assertQueue(queueName).then(function (ok) { return channel.sendToQueue(queueName, new Buffer(msg), {
persistent: true
});
})
.then(function (data) { if (data) {
errCallBack && errCallBack("success");
channel.close();
}
})
.catch(function () {
setTimeout(() => { if (channel) {
channel.close();
}
}, 500)
});
})
.catch(function () {
let num = self.index++; if (num
|
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/75/viewspace-2804523/ ,如需转载,请注明出处,否则将追究法律责任。