00001025
消息队列中间件(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”一条消息。