nodejs一个函数实现消息队列中间件

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

posted @ 2018-02-07 13:11  luoc83  阅读(1657)  评论(0编辑  收藏  举报