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

问题描述 投票:1回答:1

我正在创建一个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);
node.js sockets socket.io scalability sticky-session
1个回答
0
投票

我认为你的CPU内核会做一些非常相似的事情,但我相信这个问题应该以一种方式重新措辞,它正在探索如何通过利用多个CPU来解决这个问题,假设你有> = X画,其中X是#的CPU。您没有直接将CPU分配给各个绘画,操作系统已经过优化,可以提供选择最佳可用方式的智能方法。

了解如何设置工作人员来监听套接字连接?您可以发出要在每个工作程序中发出的数据。

下面的代码取自this SO帖子,我稍作改动。

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.