消息隊列中間件(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”一條消息。