Запросы на Node.js тайм-аут сервера из-за нескольких запросов - PullRequest
3 голосов
/ 06 марта 2020

Так что я не очень опытен с узлом, так что терпите меня.

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

Маршрут 1 выглядит следующим образом:

  app.post('/route1', function (req, res) {
    doStuff().then(function(data){
      res.end();
    })
  }

Маршрут 2 обрабатывает массив данных, который необходимо проанализировать, поэтому одновременно обрабатывается 1 запись в массиве

app.post('/route2', function (req, res){
 async function processArray(array) {
      for (const item of array) { 
         await file.test1()(item, res);
           await file.test2()(item, res);
             //await test3,test4,test5,test6 
      }
  }
  processArray(data).then(function() {
    res.end();
  }
}

Итак, я предполагаю, что проблема в том, что async / await ждет, пока ресурсы не станут доступными, прежде чем он продолжит обрабатывать записи.
Есть ли способ написать мне туда, где route1 не будет мешать с маршрутом 2?

Ответы [ 2 ]

1 голос
/ 07 марта 2020

В узле почти все, что вы можете await (или вызвать then вкл), является асинхронным. Он не блокирует поток выполнения, а скорее выгружает задачу на другой уровень, который вы не контролируете, а затем просто ожидает его завершения, когда он может работать над чем-то другим. Это включает в себя работу с файловой системой и сетевыми запросами. Существуют способы еще блокировать поток, например, используя синхронные версии методов файловой системы (например, readFileSync вместо readFile) или делая тяжелые вычисления на javascript (например, вычисляя факториал 4569485960485096)

Учитывая, что ваш route1 ничего не делает, он не берет никаких ресурсов от route2. Они работают параллельно. Трудно сказать, не видя реального кода, но я почти уверен, что вы получаете тайм-аут соединения, потому что ваш route2 плохо написан, и требуется много времени для разрешения (или вообще не разрешения) по причинам, не связанным с Node производительность или блокировка. Node просто охлаждает, ожидая, пока ваша файловая система выполнит эти бесконечные тесты 6 раз в каждом элементе массива (или что там происходит), и пока это происходит, браузер перестает ждать ответа и показывает время ожидания соединения. Скорее всего, вам не нужно ждать каждого теста для каждого массива данных, вместо того, чтобы просто выполнять их все параллельно

Подробнее здесь https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/ и здесь https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

0 голосов
/ 07 марта 2020

NodeJs однопоточный. Вот почему вы разбиваете интенсивные сервисы процессора / ресурсов на микросервисы.

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

Опять же, если вы говорите о производственной ситуации с огромной пользовательской базой, то не очень хорошая идея собрать их вместе и запустить на том же сервере.

См. Это для получения дополнительной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...