Как заставить экспресс Node.JS отвечать на запросы во время большой нагрузки? - PullRequest
0 голосов
/ 27 сентября 2018

Я создаю веб-процессор nodejs.Время обработки составляет ~ 1 минуту.Я POST на свой сервер и получаю статус, используя GET

, это мой упрощенный код

// Configure Express
const app = express();
app.listen(8080);

// Console
app.post('/clean, async function(req, res, next) {

    // start proccess
    let result = await worker.process(data);

    // Send result when finish
    res.send(result);
});

// reply with when asked
app.get('/clean, async function(req, res, next) {
    res.send(worker.status);
});

Проблема в том.Сервер так усердно работает в процессе POST /clean, что GET /clean не получают ответа вовремя.

Все GET /clean запросы отвечают после того, как работник завершает свою задачу и освобождает процессор для ответа на запрос.

enter image description here

Другими словами.Приложение не может ответить во время рабочей нагрузки.

Как мне обойти эту ситуацию?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Поскольку node.js запускает ваш Javascript как однопоточный (только одна часть Javascript когда-либо запускается одновременно) и не использует временной интервал, пока ваш worker.process() выполняет свой синхронный код, никакие другие запросы не могут быть обработанываш сервер.Вот почему worker.process() должен завершиться до того, как будет обработан любой из http-запросов, поступивших во время его работы.Цикл событий node.js занят до тех пор, пока worker.process() не будет выполнен, поэтому он не может обслуживать любые другие события (например, входящие запросы HTTP).

Вот некоторые из способов обойти это:

  1. Сгруппируйте свое приложение со встроенным модулем кластера, чтобы у вас была куча процессов, которые могут либо работать с кодом worker.process(), либо обрабатывать входящие запросы http.

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

  3. Создать рабочую очередь из группы дополнительных процессов node.js, которые выполняют задания, которыепомещаются в очередь и настраивают эти процессы, чтобы иметь возможность запускать ваш код worker.process() из очереди.Это вариант # 2, который ограничивает число процессов и сериализует работу в очередь (лучше управляемую, чем # 2).

  4. Пересмотр способа, которым worker.process() выполняет свою работу такчто он может выполнять несколько мс работы за раз, а затем вернуться обратно к циклу сообщений, чтобы другие события могли выполняться (например, входящие запросы http), а затем возобновить свою работу еще на несколько мс за раз.Обычно это требует создания какого-либо объекта с состоянием, который может выполнять небольшую работу за раз, когда он вызывается, но часто бывает сложно эффективно программировать.

Обратите внимание, что #1, № 2 и № 3 требуют, чтобы работа выполнялась в других процессах.Это означает, что process.status() нужно будет получить статус от этих других процессов.Итак, вам либо понадобится какой-то межпроцессный способ связи с другими процессами, либо вам нужно будет сохранять состояние по мере того, как вы переходите в какое-то хранилище, доступное для всех процессов (например, redis), чтобы его можно было просто извлечь из него..

0 голосов
/ 27 сентября 2018

Нет необходимости обходить однопоточную природу JS, за исключением преобразования вашего сервиса в кластер процессов или использования чего-то экспериментального, например Рабочие потоки .

Если ни один из этих вариантовработать для вас, вам нужно периодически отдавать поток обработки, чтобы другие задачи могли работать над вещами:

function workPart1() {
  // Do a bunch of stuff
  setTimeout(workPart2, 10); 
}
function workPart2() {
  // More stuff
  setTimeout(workPart3, 10); // etc. 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...