Я работаю над приложением чата с socket.io и узлом кластера со всеми входящими сокетами, которые будут обрабатываться конкретным экземпляром узла (требуется для приложений) - PullRequest
1 голос
/ 14 июля 2020

В моем главном узле TCP-сокет перехватывает все запросы, где я хочу разделить обычные HTTP-запросы и веб-запросы. Мне нужно, чтобы соединения wobsocket обрабатывались конкретным узлом за раз (скажем, рабочий 5 обрабатывает все соединения, пока сокетные соединения не достигнут 10, а следующие 10 будут обрабатываться, скажем, рабочим 6). Для этого он проверяет http-пакет внутри него и отправляет сокет экземпляру apt node через IP C, но я не могу запустить объект запроса для express маршрутов. Сервер в рабочем узле получает событие подключения, как указано в приложении. js файл как: LABEL, но ни один из моих express маршрутов не работает

Cluster. js

// cluster.js
const cluster = require('cluster');
const net =require('net')
const os = require('os');

if (cluster.isMaster) { 
    var workers=[]
  const num_processes = os.cpus().length;
  var spawn = function(i) {
    workers[i] = cluster.fork();

    // Optional: Restart worker on exit
    workers[i].on('exit', function(worker, code, signal) {
        // logger.log('respawning worker', i);
        console.log('respawning worker', i)
        spawn(i);
    });
};

// Spawn workers.
for (var i = 0; i < num_processes; i++) {
    spawn(i);
}

var server = net.createServer(function(c) { //'connection' listener
  console.log('client connected');
  c.on('end', function() {
    console.log('client disconnected');
  });
  c.on('data',function(data){
      console.log(data.toString())
      c.pause()
      workers[1].send('sticky-session:connection', c)
  })

});
server.listen(5000, function() { //'listening' listener
  console.log('server bound');
});
//   var server = net.createServer({ pauseOnConnect: true }, function (connection) {

//     // Incoming request processing
//     var remote = connection.remoteAddress;
//     var local = connection.localAddress;
//     var cIp = remote + local;
//     var ip = cIp.match(/[0-9]+/g)[0].replace(/,/g, '');
//     // var wIndex = (ip+Math.floor(Math.random() * 10)) % num_processes;
//     var wIndex=2;
//     connection.on('end', function() {
//         console.log('client disconnected');
//       });
//       connection.on('data',function(data){console.log(data.toString())})
//     var worker = workers[wIndex];
    
//     console.log("Message to work "+ worker+", remote: "+ remote+ ", local: "+ local+", ip: "+ ip +", index: "+ wIndex)
//     // logger.log("Message to work "+ worker+", remote: "+ remote+ ", local: "+ local+", ip: "+ ip +", index: "+ wIndex);
//     worker.send('sticky-session:connection', connection);
    
// });
// server.maxConnections = Infinity;
// server.listen(5000, function() { //'listening' listener
//   console.log('server bound');
// });
// net.createServer({pauseOnConnect:true},(connection)=>{
//     console.log(connection)
// }).listen(5000)

} else {
  require('./app');
}

server. js

const http=require('http')
const express = require("express")

const hostname='0.0.0.0';
const port=process.env.PORT || 5001;
const app=express();
const server=http.createServer(app)
process.on('message', function(message, connection) {
    if (message !== 'sticky-session:connection') {
        return;
    }
// console.log(connection);

    // Emulate a connection event on the server by emitting the
    // event with the connection the master sent us.
    server.emit('connection', connection);
    server.on('connection',(sock)=>{console.log(sock)})//:LABEL
    connection.resume();
});

Также мне нужно предложение go таким образом, отправить запрос на указанный c рабочий узел программно и не оставляя это делать кластеру узлов. Другой известный мне способ совместить сокет io и кластер узлов - через адаптер Redis, но из-за некоторой простоты работы я рассматриваю этот способ

...