Событие подключения к серверу узла запускается, но событие запроса не запускается - PullRequest
1 голос
/ 14 июля 2020

Я работаю над приложением чата, где главный узел получает запрос через TCP-сокет и после анализа, передает ли его обычный HTTP-запрос или веб-сокет сокет рабочий узел. Я вижу, что когда сокет не читается (т.е. socket.on ('data') не запускается) до того, как он передается на рабочий узел, событие запроса запускается, но когда сокет читается и затем передается рабочему узлу, событие запроса не запускается на сервере и маршруты не обрабатываются.

кластер. 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);
}
//:LABEL1
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');
});
//:LABEL2
//   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');
// });


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

приложение. 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)})//:LABEL3
    server.on('request',(req)=>{console.log(req)})//:LABEL4
    connection.resume();
});

В кластере. js, прокомментированный, это где, сокет не читается и при соединении передается рабочему узлу, но в раскомментированном он читается и затем передается рабочему узлу . поэтому в коде без комментариев (LABEl1) событие подключения server.on ('connection') (LABEL3 в приложении. js) запускается, но запрос события не запускается (LABEL 4 в приложении. js), но в коде с комментариями (LABEL2), срабатывает и соединение, и событие события (приложение js). Мне нужно прочитать сокет, а затем отправить его на рабочий узел

Кто-нибудь может уточнить, в чем разница и как я могу ее решить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...