Возможно ли использовать 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
Я удивлен, что ваш пример вообще работает - кажется, что вы указываете свой «RedisStore» на «localhost: 8888», где также находится ваша веб-страница сервер слушает. Вы должны указать свой «RedisStore» на своем сервере redis (порт по умолчанию '6379'). –
Я верю, что socket.io создает сервер redis, это не что-то настроенное и уже запущенное на машине. Вероятно, вы правы, это должен быть другой порт, и с тех пор я установил его на 6379, хотя это не решило проблему. – dak
Нет, это определенно не так. Вам нужно запустить сервер redis самостоятельно, чтобы использовать RedisStore. Мне кажется странным, что socket.io не дает вам об этом ошибки. –