Является ли хорошей практикой запуск http-сервера на одном порту для разветвлений кластера на 1-3 тыс. запросов в секунду?

Это хороший способ создать высоконагруженный сервер на node.js? Мне нужно запустить высоконагруженный (1-3k запросов) http-сервер для обработки почтовых запросов. В качестве бэкэнда я выбрал node.js с экспрессом. Я создал один общий http-сервер для всех разветвленных процессов. Локальные тесты дают мне результат в 3,75 секунды на 3000 запросов.

    const cluster = require('cluster');
    const port = 3000;
    var express = require('express');
    var cors = require('cors');
    var queryController = require('./controllers/queryController');
    var app = express();
    app.set('view engine', 'ejs');
    app.use(cors());

    if (cluster.isMaster) {
       const cpuCount = require('os').cpus().length;
       // Forking.
       for (let i = 0; i < cpuCount; i++) {
           cluster.schedulingPolicy = cluster.SCHED_NONE;
           cluster.fork();
       }
       cluster.on('fork', (worker) => {
           console.log(Worker #${worker.id} is up!);
       });
       cluster.on('listening', (worker, address) => {
           worker.on('message', (msg)=>{
           ...
           } );
       });
       cluster.on('disconnect', (worker) => {
           console.log(The worker #${worker.id} has disconnected);
       });
       cluster.on('exit', (worker) => {
           console.log(Worker ${worker.id} is dead);
           cluster.fork();
       });
    } else {
//All forks listen 3000 port and each uses own controller to handle a requests
       queryController(app,cors);
       app.listen(port, function(){
       // console.log("Listening on port 3000!");
       });
       process.on('uncaughtException', (err) => {
           console.error(err.message);
           console.error(err.stack);
           process.exit(1);
       });
    }

person the_man    schedule 16.08.2019    source источник
comment
Я не понимаю, какой вопрос вы задаете. Когда вы превышаете масштаб одного процесса node.js, рекомендуется масштабировать на одном сервере с помощью локальной кластеризации (все на одном порту). Когда вы превышаете этот масштаб, рекомендуется кластеризовать несколько серверов, используя какой-либо балансировщик нагрузки/прокси для распределения нагрузки. Когда вы превысите этот масштаб, вы можете масштабироваться географически, чтобы запросы из разных регионов направлялись в разные центры обработки данных, которые находятся ближе к ним в сети (например, в США, Европе, Африке, Азии и т. д.).   -  person jfriend00    schedule 16.08.2019
comment
Могут быть некоторые сценарии, в которых использование высокопроизводительного балансировщика нагрузки для распределения нагрузки между отдельными серверными процессами (на одном компьютере) на отдельных портах лучше, чем совместное использование всеми процессами одного порта. В конечном итоге это будет решено только с помощью тестирования.   -  person jfriend00    schedule 16.08.2019
comment
Спасибо @jfriend00, на самом деле это ответ на мой вопрос: рекомендуется масштабировать на одном сервере с помощью локальной кластеризации (все на одном порту) . Это мой первый опыт работы с nodejs. Я понял, что можно использовать вилки для одного и того же порта, но не понял, что это правильный подход для получения максимума с серверной машины и nodejs.   -  person the_man    schedule 16.08.2019


Ответы (1)


Когда вы превышаете масштаб одного единственного процесса node.js, хорошей практикой является масштабирование на одном сервере с использованием локальной кластеризации (все на одном и том же порту), если обработка вашего процессора node.js действительно является узким местом (а не каким-то общим ресурсом). как ваш сервер базы данных, который сам должен быть кластеризованным или масштабируемым). Это рекомендуемая схема из модуля кластера, встроенного в node.js.

Когда вы превышаете этот масштаб, рекомендуется кластеризовать несколько серверов, используя какой-либо балансировщик нагрузки/прокси для распределения нагрузки. Когда вы превысите этот масштаб, вы можете масштабироваться географически, чтобы запросы из разных регионов направлялись в разные центры обработки данных, которые находятся ближе к ним в сети (например, в США, Европе, Африке, Азии и т. д.).

Могут быть некоторые сценарии (все зависит от того, где находятся узкие места), когда использование высокопроизводительного балансировщика нагрузки для распределения нагрузки между отдельными серверными процессами (на одном компьютере) на отдельных портах лучше, чем когда все процессы используют один порт. . В конечном итоге это будет решено только с помощью тестирования.

person jfriend00    schedule 16.08.2019