nodejs訊息推送之socket.io 與 ws對比
阿新 • • 發佈:2018-11-10
node.js的websocket庫目前比較熱門的是ws和socket.io。我們對比一下這兩個庫。
一、筆者寫這篇文章時,ws的周下載量是4百多萬,最近一次更新是11天前,總共98個版本。
socket.io周下載量接近2百萬,最近一次更新是三個月前。總共110個版本
從npm上看,使用ws的比socket.io多很多,活躍度差不多。
二、ws客戶端不支援瀏覽器,需要使用者自行封裝websocket。
socket.io客戶端對瀏覽器有良好的支援。socket.io客戶端封裝的websocket請求自帶id,伺服器可以根據id區分客戶端,進行精準推送。
三、
ws和socket.io都可以單獨作為websocket伺服器,也可以掛到express和koa框架,同時提供web和websocket服務。
四、
筆者簡單測試了一下兩個庫的效能,websocket整合到koa框架,程式碼如下:
ws服務端:
let server = http.createServer(app.callback()); const wss = new WebSocket.Server({ server }); let count = 0; let beginTime = Date.now(); wss.on('connection', function connection(ws) { ws.on('message', function (data) { console.log(data+', count: ', count++); if(count === 10000){ let endTime = Date.now(); console.log('use time: ', endTime-beginTime); } }); }); server.listen(4001);
ws客戶端:
const WebSocket = require('ws');
for(let i = 0; i<10000;i++){
let ws = new WebSocket("ws://localhost:4001");
ws.on('open', function open() {
ws.send('hello');
});
}
啟5000個客戶端時,ws用時12973毫秒。啟10000個客戶端時,用時19050毫秒。啟20000個客戶端時,直接報錯:
socket.io服務端:
let server = http.createServer(app.callback()); let socketIo = new SocketIo(server); let count = 0; let beginTime = Date.now(); socketIo.on('connection', function(client){ client.on('hello', function (data) { console.log(data+', count: ', count++); if(count === 10000){ let endTime = Date.now(); console.log('use time: ', endTime-beginTime); } }); }); server.listen(4001);
socket.io客戶端:
const socketIo = require('socket.io-client');
for(let i = 0;i<10000;i++){
let socket = new socketIo('http://localhost:4001');
socket.emit('hello', 'hello');
}
啟5000個客戶端時,用時29215毫秒,啟10000個客戶端時,socket.io跑到8千多個就啟不了了:
結果是,ws正如它宣稱的:速度最快的websocket庫之一。速度要比socket.io快一倍。socket.io連線數不足時客戶端不會報錯,健壯性比ws好。ws客戶端在封裝時需要考慮連線數不足時的錯誤處理。
另外,連線數的多少跟伺服器有關,線上部署時,需要進行設定,在此不詳述。
通過對比,筆者決定選擇ws做為node.js的websocket伺服器。