Node.js Розетка.кластеризация ввода-вывода — как установить максимальное количество клиентов на одного работника?

#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 процессе