我正在创建一个 Node.js 应用程序,用于在 HTML5 Canvas 上进行协作绘图。我使用 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); 

请您参考如下方法:

我认为你的 CPU 核心无论如何都会做一些非常相似的事情,但我相信这个问题应该以一种方式重新表述,即它正在探索如何通过利用多个 CPU 来解决这个问题,假设你有 >= X 画,其中 X 是 CPU 的数量。您不必直接将 CPU 分配给各个绘画,操作系统经过了很好的优化,可以提供明智的方法来选择最佳的可用绘画。

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

Code below is taken from this SO post, I've slightly changed it.

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


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!