Я работаю над приложением чата, где главный узел получает запрос через 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). Мне нужно прочитать сокет, а затем отправить его на рабочий узел
Кто-нибудь может уточнить, в чем разница и как я могу ее решить?