HTML5 canvas 与 Node.js、聚类和 Socket.IO
HTML5 canvas with Node.js, clustering and Socket.IO
我正在创建一个 Node.js 应用程序,用于在 HTML5 canvas 上协作绘图。我正在使用 Socket.IO 进行通信,并且我已经实施了集群,因此我能够扩展我的应用程序。我的讲师告诉我,使用集群是一个好主意,但让 cpu 中的每个核心都做同样的事情并不明智,即违背了目的。所以在我的例子中,让 8 个核心处理完全相同的绘画并不明智,而是可能有 8 个不同的绘画,每个核心一个绘画。我也知道 Socket.IO 只能通过一个核心进行通信。现在我对从哪里开始以及如何开始有点困惑。我知道有这个 "sticky" 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 核心无论如何都会做一些非常相似的事情,但我认为这个问题应该以一种方式重新措辞,它正在探索你将如何通过利用多个 CPUs 假设你有 >= X 幅画,其中 X 是 CPUs 的#。您不会直接将 CPU 分配给单独的画作,OS 经过很好的优化,可以想出聪明的方法来选择最好的画作。
看看工作人员是如何设置来监听套接字连接的?您可以在每个工作人员中发出您想要发出的数据。
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);
}
我正在创建一个 Node.js 应用程序,用于在 HTML5 canvas 上协作绘图。我正在使用 Socket.IO 进行通信,并且我已经实施了集群,因此我能够扩展我的应用程序。我的讲师告诉我,使用集群是一个好主意,但让 cpu 中的每个核心都做同样的事情并不明智,即违背了目的。所以在我的例子中,让 8 个核心处理完全相同的绘画并不明智,而是可能有 8 个不同的绘画,每个核心一个绘画。我也知道 Socket.IO 只能通过一个核心进行通信。现在我对从哪里开始以及如何开始有点困惑。我知道有这个 "sticky" 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 核心无论如何都会做一些非常相似的事情,但我认为这个问题应该以一种方式重新措辞,它正在探索你将如何通过利用多个 CPUs 假设你有 >= X 幅画,其中 X 是 CPUs 的#。您不会直接将 CPU 分配给单独的画作,OS 经过很好的优化,可以想出聪明的方法来选择最好的画作。
看看工作人员是如何设置来监听套接字连接的?您可以在每个工作人员中发出您想要发出的数据。
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);
}