2016-11-07 105 views
0

我有一個承載WebSocket服務器的NodeJS。 WebSocket重新分配來自Redis的消息。NodeJS + Redis + WebSocket內存管理?

完整的一行是,我有一些Python腳本,在Redis中推送一些數據,之後NodeJS是將Redis新輸入數據讀取到連接客戶端的WebSocket。我的問題是NodeJs總是佔用內存,過了一段時間它就會突然停止。

我不知道我的問題是什麼,因爲我的代碼非常簡單。

我不需要我的WebSocket接收來自連接客戶端的消息,因爲我只需要將它們推送到數據中,但是需要大量數據。

var server = require('websocket').server, 
    http = require('http'); 
var redis = require("redis"), 
    client = redis.createClient(); 

var socket = new server({ 
httpServer: http.createServer().listen(443), 
keepalive: false 
}); 

client.subscribe("attack-map-production"); 
socket.on('request', function(request) { 
var connection = request.accept(null, request.origin); 

connection.on('message', function(message) { 
    console.log(message); 
      client.on("message", function(channel, message){ 
        connection.send(message); 
      }); 
}); 

connection.on('close', function(connection) { 
    console.log('connection closed'); 
}); 
}); 

我期待,使這項工作沒有吃所有的記憶在我的服務器上,並且可能使這個多快,但我認爲它的速度不夠快。

也許NodeJS不適合這種工作?

任何幫助表示讚賞。 謝謝。

更新2016年11月8日
下面提供的信息,我有「更新」我的代碼。問題仍然存在,我會繼續環顧四周尋找答案......但我真的沒有得到這個。

var server = require('websocket').server, 
    http = require('http'); 
var redis = require("redis"), 
    client = redis.createClient(); 


var socket = new server({ 
httpServer: http.createServer().listen(443), 
keepalive: false 
}); 

client.subscribe("attack-map-production"); 

socket.on('request', function(request) { 
var connection = request.accept(null, request.origin); 

    client.on("message", function(channel, message){ 
      connection.send(message); 
    }); 

connection.on('close', function(connection) { 
    console.log('connection closed'); 
}); 
}); 

更新2016年11月16日

因此,這裏是我的新代碼:

var io = require('socket.io').listen(443); 
var sub = require('redis').createClient(); 

io.sockets.on('connection', function (sockets) { 
    sockets.emit('message',{Hello: 'World!'}); 
    sub.subscribe('attack-map-production'); // Could be any patterni 

    sockets.on('disconnect', function() { 
      sub.unsubscribe('attack-map-production'); 
    }); 
}); 

sub.on('message', function(channel, message) { 
    io.sockets.json.send(message); 
}); 

即使這樣的代碼,使得去的NodeJS在100%的CPU,甚至更多,而且它開始變得非常緩慢,直到一切都停止。

我的數據的完整流程是一個python腳本將數據推送到Redis,並且通過我的訂閱,它通過webSocket和Socket.io將我的數據推送回瀏覽器。

那麼簡單,這怎麼會慢呢?我只是不明白。

+0

感謝您的意見,我會檢查這一點,如果它有效,請回復您。 – user1861854

回答

0

也許NodeJS不適合這種工作?

如果節點的意思是這樣的話。 I/O流和讀/寫是節點異步的主要優點。

你在使用什麼樣的服務器?在一個太小的EC2實例中,你可能會遇到一些內存問題。

否則它是泄漏。這很難追查。

代碼是小想法。

我會刪除任何console.log以防萬一。

connection.on('message', function(message) { 
    console.log(message); 
      client.on("message", function(channel, message){ 
        connection.send(message); 
      }); 
}); 

這部分感覺可疑,具有相同名稱的兩個變量,一個未使用的變量,它要求的麻煩,我真的不明白爲什麼你爲了等待Redis的消息監聽連接消息。

+0

感謝您的信息。我已經清理了我的代碼..以及我認爲...但同樣的問題發生。我真的不知道爲什麼......我的代碼中沒有任何內容。這裏是我的「新」代碼: socket.on('request',function(request){ var connection = request.accept(null,request.origin); client.on(「message」,function ,消息){ connection.send(消息); }); connection.on( '關閉',功能(連接){ 的console.log( '連接關閉'); }); }); – user1861854

0
client = redis.createClient(); 

看看這條線,每次你調用變量客戶端,創建內部節點Redis的客戶端的一個實例,你永遠不會關閉它。所以如果你收到10000個套接字'請求',你也將有10000個redis實例。

你需要調用命令client.quit()一次寫或讀來的Redis做

var server = require('websocket').server, 
    http = require('http'); 
var redis = require("redis"), 
    client = redis.createClient(); 


var socket = new server({ 
httpServer: http.createServer().listen(443), 
keepalive: false 
}); 

client.subscribe("attack-map-production"); 

socket.on('request', function(request) { 
var connection = request.accept(null, request.origin); 

    client.on("message", function(channel, message){ 
      connection.send(message); 
    }); 

client.quit(); // MISSING LINE 

connection.on('close', function(connection) { 
    console.log('connection closed'); 
}); 
}); 

,我也注意到了這一段代碼

httpServer: http.createServer().listen(443) 

端口443用於https!所以如果你使用的是安全連接,你需要調用模塊HTTPS不是http,像這樣

var socket = new server({ 
httpServer: https.createServer().listen(443), 
keepalive: false 
}); 

希望它有幫助!