#javascript #node.js #socket.io #cluster-computing
#javascript #node.js #socket.io #кластерные вычисления
Вопрос:
У меня 4 ядра CPU
с 8 логическими процессорами, которые в этом коде создают 8 рабочих и 1 главный процесс. Как мне указать максимальное количество socket.io
клиентов / подключений worker
, которые может принимать каждый?
Например, если worker 1
имеет 10 (предельных) подключений -> Подключить клиента к worker 2
Node.js Код кластеризации
const os = require('os'),
cluster = require('cluster'),
cores = os.cpus();
var clusterCount = 0;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Fork workers
for (let i = 0; i < cores.length; i ) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
}
else {
const http = require('http'),
express = require('express'),
socketio = require('socket.io'),
process = require('process');;
var cpu = cores[clusterCount];
var app = express();
var port = process.env.PORT || process.argv[2] || 8080;
var server = app.listen(port);
var io = socketio(server);
io.adapter(socketioRedis({ host: config.redis_host, port: config.redis_port }));
io.on('connection', (socket) => {
console.log(`User ${socket.id} connected to worker ${process.pid}`);
});
console.log(`Worker ${process.pid} started on port: ${port} | ${cpu.model}`);
clusterCount ;
}
Ответ №1:
Вы могли бы сделать что-то вроде:
var workerConnects = [ ]
//inside your for loop for getting how many cores do:
workerConnects.push(0) //To set up array for remembering how many connections each worker has
//Each connection attempt run:
for(var i = 0; i<workerConnects; i ){
if(workerConnects[i]<10){
//connect user to that worker
workerConnects[i] = workerConnects[i] 1;
//-1 for disconnect
}
}
Комментарии:
1. Я думаю, что эта логика недопустима для данного экземпляра, или я могу неправильно реализовать ваш пример. Клиенты подключаются непосредственно к
io.on
рабочему — idk, гдеif
оператор может быть реализован до подключения2. Хм, да, возможно, я допустил здесь ошибку, я делаю что-то на своем телефоне: D Я еще раз просмотрю ваш код, и, возможно, есть способ посмотреть, сколько клиентов подключено внутри Socket.io
3. Не беспокойтесь, не торопитесь 🙂 — есть способ проверить, сколько клиентов есть, но опять же, это делается ПОСЛЕ установления соединения. Необходимо заранее перенаправить клиентов другим работникам, возможно, маршрутизацию необходимо выполнить в
master
процессе