我正在创建一个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);
答案 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);
}