2016-11-07 5 views
0

WebSocket ServerをホストするNodeJSがあります。 WebSocketはRedisからのメッセージを再配布します。NodeJS + Redis + WebSocketメモリ管理?

完全な行は、私はRedisでいくつかのデータをプッシュするいくつかのPythonスクリプトを持っているし、その後NodeJSは接続されたクライアントにRedisの新しく入力されたデータを読み取るWebSocketです。私の問題は、NodeJが常にメモリを占有しているということです。しばらくしてから、バーストして停止します。

私のコードはかなりシンプルなので、私の問題は分かりません。

データをプッシュするだけでデータはたくさんあるため、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); 
      }); 
}); 

この部分は、同じ名前を持つ2つの変数を不審に感じ、未使用の変数は、それがトラブルのために呼び出し、あなたは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ソケットの 'request'を受信すると、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のためのものです!そう、あなたがモジュールを呼び出す必要が安全な接続を使用している場合は、この

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

のように、HTTPではなくHTTPSを、それが役に立てば幸い!