带有Node.js,群集和Socket.IO的HTML5画布

时间:2018-12-12 11:08:33

标签: node.js sockets socket.io scalability sticky-session

我正在创建一个Node.js应用程序以在HTML5画布上进行协作绘图。我正在使用Socket.IO进行通信,并且已经实现了群集,因此可以扩展应用程序。我的讲师告诉我,使用群集是个好主意,但要使CPU中的每个核心都做同样的事情并不明智,即,这违背了目的。因此,在我的情况下,让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 :(得分:0)

我认为您的CPU内核无论如何都会做类似的事情,但是我认为应该以这样一种方式重新提出这个问题:假设您有> = X幅画,其中X表示您将如何利用多个CPU解决此问题。是CPU的数量。您不会直接将CPU分配给各个画作,操作系统已进行了优化,以提供选择最佳可用画作的明智方法。

查看工作人员如何设置以侦听套接字连接?您可以在每个工作进程中发出要发出的数据。

  

下面的代码摘自this这样的帖子,我已经对其稍作更改。

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