Вопрос. Можно ли кластеризовать приложение, которое использует Socket.io для поддержки WebSocket? Если да, то какой метод реализации будет лучшим?
Я создал приложение, использующее Express и Socket.io, на основе Node.js. Я хотел бы включить кластеризацию, чтобы увеличить количество запросов, которые может обрабатывать мое приложение.
Следующее заставляет мое приложение выдавать ошибку установления связи сокета ...
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('death', function(worker) {
console.log('worker ' + worker.pid + ' died');
});
} else {
app.listen(3000);
}
Журнал консоли показывает, что socket.io запускается несколько раз.
jack@jack:~$ node nimble/app.js
info - socket.io started
info - socket.io started
info - socket.io started
info - socket.io started
info - socket.io started
info - socket.io started
info - socket.io started
info - socket.io started
info - socket.io started
Socket.io в настоящее время настраивается в верхней части моего кода сервера, используя:
var io = require('socket.io').listen(app);
Код авторизации websocket:
//Auth the user
io.set('authorization', function (data, accept) {
// check if there's a cookie header
if (data.headers.cookie) {
data.cookie = parseCookie(data.headers.cookie);
data.sessionID = data.cookie['express.sid'];
//Save the session store to the data object
data.sessionStore = sessionStore;
sessionStore.get(data.sessionID, function(err, session){
if(err) throw err;
if(!session)
{
console.error("Error whilst authorizing websocket handshake");
accept('Error', false);
}
else
{
console.log("AUTH USERNAME: " + session.username);
if(session.username){
data.session = new Session(data, session);
accept(null, true);
}else {
accept('Invalid User', false);
}
}
})
} else {
console.error("No cookie was found whilst authorizing websocket handshake");
return accept('No cookie transmitted.', false);
}
});
Консольный журнал сообщения об ошибке:
Error whilst authorizing websocket handshake
debug - authorized
warn - handshake error Error