Node.JS- масштабируемый (с использованием Node.JS-кластера) сокет-сервер с Engine.IO, сопряжение / синхронизация (также называемая вторым экраном) двух устройств на одном и том же компьютере…

У меня есть вопрос… Я хочу запустить сокет-сервер NodeJS (я решил пойти с EngineIO, от чтения по производительности / кросс-браузер / и т. Д.) И иметь возможность увеличивать масштаб (добавляя ядра). Поэтому я хочу использовать кластерный модуль (хотя на экспериментальной стадии кажется, что все говорят о его надежности). Вместо этого я рассмотрел использование балансировщика нагрузки в nginx, но он кажется слишком сложным для этого проекта (везде упоминается, что это расширенный вариант).

Поэтому моя большая проблема, которую мне нужно решить, заключается в следующем: мне нужно иметь два разных устройства в одном потоке, чтобы они могли "общаться" (решение второго экрана>, например, это: https://www.google.com/intl/en/chrome/browser/promo/supersync/). В любом случае, EngineIO, похоже, не поддерживает общее хранилище (например, разделяемое RedisStore), и я думаю, что оно слишком продвинуто, чтобы реализовать себя…

Поэтому я подумываю о настройке, в которой я помещаю каждого рабочего процесса на отдельный порт, а затем, когда одно из устройств подключается к экземпляру EngineIO на этом конкретном работнике (нагрузка балансируется кластером nodejs), он может отображать уникальный код (который должен быть введен на втором устройстве), где последняя цифра сообщит второму устройству, к какому порту подключаться. Я понял, что мне нужно sticky-сеанс, чтобы соединение каждого устройства оставалось в том же потоке (или, по крайней мере, на первом устройстве), поскольку я не знаю порт этого работника при подключении EngineIO.

Мне удалось запустить несколько рабочих на разных портах... Но что-то не так. Я не нашел примеров разработчиков, реализующих такую ​​структуру. Может быть, это не делает это неправильно, но я чувствую, что должен получить чье-то мнение по этому поводу. Итак, мой вопрос: это хорошая идея, чтобы иметь разные рабочие процессы на разных портах, чтобы иметь возможность знать, к какому порту подключаться со вторым устройством? Что-то вроде этого:

var cluster = require('cluster'),
http = require('http');

var numCPUs = require('os').cpus().length; // or just hardcode to 2, when not more than one cpu is available...

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('listening', function(worker, address) {
    console.log("worker.id: " +  worker.id);
  });
} else {
  console.log("cluster.worker.id: " +  cluster.worker.id);

  http.createServer(function(req, res) {
    res.writeHead(200);
    res.end("hello world " + cluster.worker.id + "\n");
  }).listen(8000 + parseInt(cluster.worker.id));
}

И, конечно же, EngineIO является важной частью решения, которое не включено в приведенный выше код, а является следующим шагом.

1 ответ

Вы можете попробовать SocketCluster ( http://socketcluster.io/) - он разработан специально для работы на нескольких ядрах процессора и имеет общее хранилище данных для обмена данными между работниками. Он построен на основе Engine.io - я главный разработчик. Вы должны проверить страницу GitHub для документации, чтобы увидеть, подходит ли она для вас: https://github.com/TopCloud/socketcluster

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