Я пытаюсь проверить, возможно ли реализовать разделение logi c на HTTP-сервер в node.js с помощью модуля cluster
. Я хочу передать каждый запрос конкретному c работнику на основе некоторых данных в заголовках запроса. Может ли кто-нибудь объяснить, как заглядывать в данные, оставляя их нетронутыми для обработки express.js
?
Ниже приведен рабочий пример без логики разбиения c (в настоящее время выполняется простой циклический перебор для рабочих) :
const cluster = require('cluster');
const net = require('net');
const express = require('express');
let roundRobinIndex = 0;
if (cluster.isMaster) {
const workers = [];
for (let i = 0; i < require('os').cpus().length; i++) {
workers[i] = cluster.fork({ WORKER_INDEX: i });
}
net.createServer({ pauseOnConnect: true }, function (socket) {
if (roundRobinIndex >= workers.length)
roundRobinIndex = 0;
console.log(`received connection, passing to worker ${roundRobinIndex}`);
//
// how can I read data from the socket here while still allowing it to be passed to the worker afterwards?
//
workers[roundRobinIndex++].send('socket', socket);
}).listen(3000, () => console.log(`listening to port 3000`));
} else {
const app = express();
app.use('/', (req, res) => {
console.log(`worker ${process.env.WORKER_INDEX} received request for url: ${req.url}`);
res.send(`you called "${req.url}"`)
});
let server = app.listen(0);
process.on('message', function (message, socket) {
console.log(`worker ${process.env.WORKER_INDEX} received message from master`);
if (message === 'socket' && socket) {
server.emit('connection', socket);
socket.resume();
}
});
}
(Вызвать сервер, используя curl 'http://localhost:3000/hi'
)
Если я добавлю слушателя .on('data', ...)
, удаляю pauseOnConnect
и не отправляю сокет работнику, тогда Я могу читать входящие данные. Но я не могу одновременно прочитать данные и отправить их работнику.