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