Как настроить кластер на Node.js Express4 Socket.IO?

/bin/www:
#!/usr/bin/env node

/**
 * Module dependencies.
 */
var app = require('../app');
var debug = require('debug')('server:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = http.createServer(app);

var io               = require("socket.io")(server),
    passportSocketIo = require("passport.socketio"),
    express = require('express'),
    cookieParser = require('cookie-parser'),
    redis = require('redis'),
    session = require('express-session'),
    redisStore = require('connect-redis')(session);
var client = redis.createClient();

io.use(passportSocketIo.authorize({
  cookieParser: cookieParser,
  key:         '***',       // the name of the cookie where express/connect stores its session_id
  secret:      '*********',    // the session_secret to parse the cookie
  store: new redisStore({ host: '*****', port: *******, client: client }),
  success:     onAuthorizeSuccess,  // *optional* callback on success - read more below
  fail:        onAuthorizeFail    // *optional* callback on fail/error - read more below
}));


var ioHandlers = require('../sockets')(io,passportSocketIo);

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

в какой момент лучше породить дочерний процесс?
Возможно, есть модули, которые сюда подойдут лучше встроенного cluster.
Гугл выдаёт множество способов включения кластера, но они все как-то не похожи на то, что у меня.
Если дочерний процесс порождать в app.js, то сокеты продолжат выполняться в одном потоке.
  • Вопрос задан
  • 1364 просмотра
Пригласить эксперта
Ответы на вопрос 1
MarcusAurelius
@MarcusAurelius Куратор тега Node.js
автор Impress Application Server для Node.js
Потоки в ноде нужно порождать при старте приложения, это можно делать при помощи require('child_process').fork а вот require('cluster').fork это просто обертка вокруг него, которая позволяет передавать сокеты из родительского процесса в дочерние, чтобы распылить нагрузку на потоки. Если Вы не хотите использовать cluster, то нужно будет самому передавать handle сокета в дочерние процессы, порожденные через require('child_process').fork, через IPC, и самостоятельно организовывать алгоритм распыления, например, простой Round Robin или взвешенный Round Robin или приклеивание по IP. Чем Вас не устраивает cluster? Еще год-два назад он работал нестабильно, согласен, сам делал к нему заплаты, но теперь то cluster работает отлично как в node.js, так и в io.js
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы