1. 程式人生 > >nodejs訊息推送之socket.io 與 ws對比

nodejs訊息推送之socket.io 與 ws對比

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伺服器。