2016-11-07 4 views
0

У меня есть NodeJS, на котором размещен сервер WebSocket. WebSocket перераспределяет сообщение от Redis.Управление памятью NodeJS + Redis + WebSocket?

Полная строка: у меня есть некоторый скрипт python, который подталкивает некоторые данные в Redis, и после этого NodeJS является WebSocket, который считывает новые входные данные Redis подключенным клиентам. Моя проблема в том, что 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-08
С информацией, представленной ниже, я «обновленный» мой код. Проблема все еще есть, я буду продолжать искать, чтобы найти ответ ... но я действительно не понимаю этого.

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 не предназначен для такого рода работ?

Если узел предназначен для чего-то, это так. Поток ввода-вывода и чтение/запись являются основным преимуществом асинхронности узла.

На каком сервере вы работаете? В слишком маленьком экземпляре 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 (channel , сообщение) { 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 
}); 

надеюсь, что это помогает!

Смежные вопросы