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”一條消息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM