2012-05-11 4 views
3

Возможно ли использовать Socket.IO с основным кластером узла (не устаревшим модулем)?Socket.IO и Node.js Core Cluster

Я могу раскошеливать нескольких работников и, похоже, работает нормально; Однако, при открытии соединения, я получаю ошибку: solve: warn - client not handshaken client should reconnect

Вот соответствующий фрагмент кода (с помощью нескольких простых вещей, как expressjs CONFIG удален):

if (cluster.isMaster) { 
    for (var i = 0; i < numCPUs; i++) { 
     cluster.fork(); 
    } 
} else { 
    app.get('/', function (req, res) { 
     res.sendfile(__dirname + '/public/html/index.html'); 
    }); 

    io.configure(function() { 
     var RedisStore = require('socket.io').RedisStore, 
      opts = { host: 'localhost', port: 8888 }; 

     io.set('store', new RedisStore({ redisPub: opts, redisSub: opts, redisClient: opts })); 
    }); 

    app.listen(8888); 

    io.sockets.on('connection', function (socket) { 
     socket.emit('some', 'data'); 
    }); 
} 

Я попытался с и без использования RedisStore и с трюком на этом сайте (который, как мне кажется, устарел сейчас): http://www.danielbaulig.de/socket-ioexpress/

Я также просмотрел код на http://www.ranu.com.ar/2011/11/redisstore-and-rooms-with-socketio.html, хотя я не вижу, как этот код отличается от использования MemoryStore.

Все мои тестовые соединения используют Websockets (RFC 6455). Это отлично работает, если я изложу numCPUs равным 1.

Node.js версия 0.6.17 Socket.io версия 0.9.5 Expressjs версия 2.5.9

Update - включает вывод на консоль (примечание, на этом попытка соединения было в конечном счете работать, хотя он бросил одни и те же ошибки):

info - socket.io started 
info - socket.io started 
info - socket.io started 
info - socket.io started 
info - socket.io started 
debug - served static content /socket.io.js 
debug - client authorized 
info - handshake authorized 17644195072103946664 
debug - setting request GET /socket.io/1/websocket/17644195072103946664 
debug - set heartbeat interval for client 17644195072103946664 
debug - websocket writing 7:::1+0 
warn - client not handshaken client should reconnect 
info - transport end (error) 
debug - set close timeout for client 17644195072103946664 
debug - cleared close timeout for client 17644195072103946664 
debug - cleared heartbeat interval for client 17644195072103946664 
debug - discarding transport 
debug - client authorized 
info - handshake authorized 16098526291524652257 
debug - setting request GET /socket.io/1/websocket/16098526291524652257 
debug - set heartbeat interval for client 16098526291524652257 
debug - websocket writing 7:::1+0 
warn - client not handshaken client should reconnect 
info - transport end (error) 
debug - set close timeout for client 16098526291524652257 
debug - cleared close timeout for client 16098526291524652257 
debug - cleared heartbeat interval for client 16098526291524652257 
debug - discarding transport 
debug - client authorized 
info - handshake authorized 13419993801561067603 
debug - setting request GET /socket.io/1/websocket/13419993801561067603 
debug - set heartbeat interval for client 13419993801561067603 
debug - client authorized for 
debug - websocket writing 1:: 
debug - websocket writing 5:::{"some":"data","args":[11354]} 
debug - websocket writing 5:::{"some":"data","args":[36448]} 

Это как выход консоли заканчивается на отказ (сбой около 9 раз из 10):

info - transport end by forced client disconnection 
debug - websocket writing 0:: 
info - transport end (booted) 
debug - set close timeout for client 1639301251431944437 
debug - cleared close timeout for client 1639301251431944437 
debug - cleared heartbeat interval for client 1639301251431944437 
debug - discarding transport 
debug - got disconnection packet 
debug - got disconnection packet 

Update - Добавлены ссылки на возможные билеты на GitHub:

https://github.com/LearnBoost/socket.io/issues/881

https://github.com/LearnBoost/socket.io/issues/438

+1

Я удивлен, что ваш пример вообще работает - кажется, что вы указываете свой «RedisStore» на «localhost: 8888», где также находится ваша веб-страница сервер слушает. Вы должны указать свой «RedisStore» на своем сервере redis (порт по умолчанию '6379'). –

+0

Я верю, что socket.io создает сервер redis, это не что-то настроенное и уже запущенное на машине. Вероятно, вы правы, это должен быть другой порт, и с тех пор я установил его на 6379, хотя это не решило проблему. – dak

+1

Нет, это определенно не так. Вам нужно запустить сервер redis самостоятельно, чтобы использовать RedisStore. Мне кажется странным, что socket.io не дает вам об этом ошибки. –

ответ

3

Кажется, этот вопрос может быть связан с модулем узла, который Socket.IO поставляется с установленной.

Когда я установил redis (npm install hiredis redis) и создал клиентов для RedisStore с помощью модуля redis, все неожиданно работало отлично. Я работал более часа с ~ 500 одновременных соединений и не видел ни одной ошибки, и каждый процесс узла используется.

[email protected] [email protected]

Запуск Redis 2.6rc3 на порту 6379.

Update: В Node.s 0.8, это выглядит как библиотека кластера должна быть значительно более зрелой , поэтому вышеупомянутый код/​​проблемы, вероятно, устареют: http://nodejs.org/docs/v0.7.8/api/cluster.html