В моем главном узле 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, но из-за некоторой простоты работы я рассматриваю этот способ