Разделение кластера: просматривайте заголовки данных сокетов перед их отправкой работнику для обработки. - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь проверить, возможно ли реализовать разделение 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 и не отправляю сокет работнику, тогда Я могу читать входящие данные. Но я не могу одновременно прочитать данные и отправить их работнику.

...