NodeJS | Socket.IO, как отправить серверный обработчик работникам? - PullRequest
1 голос
/ 19 декабря 2011

Идея состоит в том, чтобы создать сервер в главном процессе и обрабатывать запросы в рабочих.Я хочу использовать все ядра ЦП и иметь своего рода баланс нагрузки.

Сначала я попытался отправить обработчик сервера от мастера к работнику:

var cluster = require('cluster');

if (cluster.isMaster) {
    var app = require('express').createServer();
    app.listen(1234);

    var worker = cluster.fork();
    worker.stdin.write('fd', 'utf8', app._handle);
} else {
    process.stdin.resume();
    process.stdin.on('fd', function(fd){
        var stream = require('net').Stream(fd);
        var io = require('socket.io').listen(stream);
        io.sockets.on('connection', function(socket){
            ...
        }
    }
}

, но запись не началась('fd' ...) обработчик события в работнике.Затем я ставлю все мастеру, чтобы проверить, возможно ли это вообще:

    var app = require('express').createServer();
    app.listen(1234);
    var stream = require('net').Stream(app._handler);
    var io = require('socket.io').listen(stream);

сервер запускается без ошибок, но не работает.Я не могу событие запросить скрипт socket.io.js со стороны клиента с тегом:

<script src="http://localhost:8080/socket.io/socket.io.js"></script>
Response: Cannot GET /socket.io/socket.io.js

Поэтому у меня две проблемы:

  1. Как отправить дескриптор открытого сокета нарабочий?
  2. Как настроить обработчик для сервера по этому дескриптору?

1 Ответ

0 голосов
/ 19 декабря 2011

Вам не нужно самостоятельно заботиться о дескрипторах файлов и т. Д., Посмотрите на похожий вопрос, на который я только что ответил:

Node.js, многопоточность и Socket.io

Пример кода:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  var sio = require('socket.io')
  , RedisStore = sio.RedisStore
  , io = sio.listen(8080, options);

  // Somehow pass this information to the workers
  io.set('store', new RedisStore);

  // Do the work here
  io.sockets.on('connection', function (socket) {
    socket.on('chat', function (data) {
      socket.broadcast.emit('chat', data);
    })
  });
}
...