Используя этот код, чтобы иметь socket.io на нескольких работниках, я всегда подключаюсь только к последнему работнику (node.je, socket.io, socket.io-redis)

Я пытаюсь настроить приложение следующим образом:

var cluster = require('cluster');
var os = require('os');

if (cluster.isMaster) {
  // we create a HTTP server, but we do not use listen
  // that way, we have a socket.io server that doesn't accept connections
  var server = require('http').createServer();
  var io = require('socket.io').listen(server);
  var redis = require('socket.io-redis');

  io.adapter(redis({ host: 'localhost', port: 6379 }));

  setInterval(function() {
    // all workers will receive this in Redis, and emit
    io.emit('data', 'payload');
  }, 1000);

  for (var i = 0; i < os.cpus().length; i++) {
    cluster.fork();
  }

  cluster.on('exit', function(worker, code, signal) {
    console.log('worker ' + worker.process.pid + ' died');
  }); 
}

if (cluster.isWorker) {
  var express = require('express');
  var app = express();

  var http = require('http');
  var server = http.createServer(app);
  var io = require('socket.io').listen(server);
  var redis = require('socket.io-redis');

  io.adapter(redis({ host: 'localhost', port: 6379 }));
  io.on('connection', function(socket) {
    socket.emit('data', 'connected to worker: ' + cluster.worker.id);
  });

  server.listen(8080);
}

из этого обсуждения: масштабирование Socket.IO для нескольких процессов Node.js с использованием кластера

Это прекрасно работает, но, похоже, не распределяет связи между работниками. Я всегда подключаюсь к последнему (в моем случае рабочий "4", так как у меня процессор 4 ядра)

Как я могу решить это?

0 ответов

Другие вопросы по тегам