nodejs一个函数实现消息队列中间件
2018-02-07 13:09
537 查看
消息队列中间件(Message Queue)相信大家不会陌生,如Kafka、RabbitMQ、RocketMQ等,已经非常成熟,在大大小小的公司和项目中也已经广泛使用。
有些项目中,如果是只使用初步的消息队列功能(比如少量客户端和简单的消息中转),对于追求“简洁美”的程序猿、攻城狮们,实在不愿意部署、维护一个消息队列中间件,那么就自己动手吧,编写几十行代码,嵌入到现有的模块,消息队列功能就能正常运转起来,是不是很有成就感呢?
下面我抛砖引玉,使用nodejs+UDP实现一个简单的消息队列。你可以用C++、JAVA、C#等其它语言,UDP也可以换成TCP、web api等。当然,如果在正式项目中使用,还得完善逻辑、添加异常处理。
*******************************udpmq.js*****************************
const udpClient = require('dgram').createSocket('udp4');
var clients= {};
udpClient.on('message', (message, socket) => {
var repMsg="";
var msgObj= JSON.parse(message.toString());
if(msgObj["id"] !=
null) {
if(clients[msgObj["id"]] !=
null &&clients[msgObj["id"]].length> 0) {
repMsg = clients[msgObj["id"]].shift();
}
}
else {
var from =msgObj["from"];
var to =msgObj["to"];
var msg =msgObj["msg"];
if(clients[to] ==
null) {
clients[to] = new Array();
}
clients[to].push(message.toString());
repMsg = "1";
}
var buf =
new Buffer(repMsg);
udpClient.send(buf, 0, buf.length, socket.port, socket.address);
});
udpClient.bind(5555);
************************************************************
测试步骤:
1) 启动服务: node udpmq.js
2) 打开两个UDP测试工具,如下图。左边是发送消息(json格式),客户端 “aa”发送给”bb”,
右图是接收消息,客户端”bb”发送自己的id给消息队列服务,服务查找“bb”的消息数组,并按FIFO的方式返回“bb”一条消息。
有些项目中,如果是只使用初步的消息队列功能(比如少量客户端和简单的消息中转),对于追求“简洁美”的程序猿、攻城狮们,实在不愿意部署、维护一个消息队列中间件,那么就自己动手吧,编写几十行代码,嵌入到现有的模块,消息队列功能就能正常运转起来,是不是很有成就感呢?
下面我抛砖引玉,使用nodejs+UDP实现一个简单的消息队列。你可以用C++、JAVA、C#等其它语言,UDP也可以换成TCP、web api等。当然,如果在正式项目中使用,还得完善逻辑、添加异常处理。
*******************************udpmq.js*****************************
const udpClient = require('dgram').createSocket('udp4');
var clients= {};
udpClient.on('message', (message, socket) => {
var repMsg="";
var msgObj= JSON.parse(message.toString());
if(msgObj["id"] !=
null) {
if(clients[msgObj["id"]] !=
null &&clients[msgObj["id"]].length> 0) {
repMsg = clients[msgObj["id"]].shift();
}
}
else {
var from =msgObj["from"];
var to =msgObj["to"];
var msg =msgObj["msg"];
if(clients[to] ==
null) {
clients[to] = new Array();
}
clients[to].push(message.toString());
repMsg = "1";
}
var buf =
new Buffer(repMsg);
udpClient.send(buf, 0, buf.length, socket.port, socket.address);
});
udpClient.bind(5555);
************************************************************
测试步骤:
1) 启动服务: node udpmq.js
2) 打开两个UDP测试工具,如下图。左边是发送消息(json格式),客户端 “aa”发送给”bb”,
右图是接收消息,客户端”bb”发送自己的id给消息队列服务,服务查找“bb”的消息数组,并按FIFO的方式返回“bb”一条消息。
相关文章推荐
- 一个Redis消息队列实现
- linux网络编程之System V 消息队列(二):消息队列实现回射客户/服务器和 msgsnd、msgrcv 函数
- 用c实现一个阻塞的消息队列
- linux网络编程之System V 消息队列(二):消息队列实现回射客户/服务器和 msgsnd、msgrcv 函数
- Java编程的逻辑 (61) - 内存映射文件及其应用 - 实现一个简单的消息队列
- 怎样在vs2010里面实现两个编辑控件对应一个消息处理函数
- 题目描述:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能
- 消息队列实现回射客户/服务器和 msgsnd、msgrcv 函数
- 消息队列实现从一个进程向另一个进程发送一个数据块的方法
- linux网络编程之System V 消息队列:消息队列实现回射客户/服务器和 msgsnd、msgrcv 函数
- 用一个消息队列(System V)实现客户端-服务器端
- 0904使用msgget函数创建一个消息队列,并返回该消息队列的描述符
- 一个消息队列类的实现C++
- 怎样在vs2010里面实现两个编辑控件对应一个消息处理函数
- C语言程序设计习题1-19 编写函数reverse(s),实现字符串的倒序,并用该函数每次颠倒一个输入行中的字符顺序
- Redis实现消息队列
- 创建一个数组, 实现函数init()初始化数组、 实现empty()清空数组、 实现reverse()函数完成数组元素的逆置。
- Nodejs扩展,实现消息弹窗
- 一个用VB实现的对任意字符串进行排列并排序的函数
- C++算法之 两个队列实现一个栈