HTML5 canvas с Node.js, кластеризацией и Socket.IO - PullRequest
0 голосов
/ 12 декабря 2018

Я создаю приложение Node.js для совместного рисования на холсте HTML5.Я использую Socket.IO для связи, и я внедрил кластеризацию, чтобы я мог масштабировать свое приложение.Мой лектор сказал мне, что использование кластеризации - хорошая идея, но было бы неразумно заставлять каждое ядро ​​процессора делать одно и то же, то есть это противоречит цели.Так что в моем случае было бы неразумно иметь 8 ядер, работающих над одной и той же картиной, но вместо этого может быть 8 разных картин, по одной картине на каждое ядро.Я также знаю, что Socket.IO общается только через одно ядро.Прямо сейчас я немного запутался, где и как начать.Я знаю, что есть этот «залипший» модуль socket.io, но он бы просто делился связью, но не создавал отдельную картину для каждого ядра?

Вот сервер, который я сделал:

let http = require('http').Server(application);
let socketIO = require('socket.io')(http);
let cluster = require('cluster'); 
let cores= require('os').cpus().length;

if (cluster.isMaster) {
    for (let i = 0; i < cores; i++) {
        cluster.fork();
    }

} else {
    process.exit();
}

function connect(socket){
    socket.on('test',
        function emit(data) {
            socket.broadcast.emit('test', data);
        });
}

socketIO.on('connection', connect);

http.listen(port);

1 Ответ

0 голосов
/ 12 декабря 2018

Я думаю, что ваши процессорные ядра в любом случае будут делать что-то очень похожее, но я считаю, что этот вопрос следует переформулировать так, чтобы он исследовал, как бы вы решили эту проблему, используя несколько процессоров, предполагая, что у вас есть> = X рисунков, где Xэто количество процессоров.Вы напрямую не назначаете ЦП отдельным изображениям, ОС хорошо оптимизирована, чтобы найти умные способы выбора наилучшего из доступных.

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

Код ниже взят из этого ТАКОГО поста, я немного изменил его.

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 }));

  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) {
    // grandeFasola - emit what you what to emit here.
    socket.emit('data', 'connected to worker: ' + cluster.worker.id);
  });

  app.listen(80);
}
...