Как сервер node.js обслуживает следующий запрос, если текущий запрос имеет огромные вычисления?

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

Есть ли какое-либо другое решение, которое мы можем сделать с node.js для того, чтобы не ждать других запросов для их очереди так долго?

Ответ 1

Как сервер node.js обслуживает следующий запрос, если текущий запрос имеет огромные вычисления?

Это не - если это вычисление происходит в основном потоке и не делится на более мелкие части.

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

  • разбивайте свои вычисления на части и используйте setImmediate или process.nextTick для их запуска.
  • использовать внешний процесс для этой задачи и вызывать его как любую другую внешнюю программу или услугу с использованием нереста HTTP, TCP, IPC или дочернего процесса или с помощью системы очередей, pub/sub и т.д.
  • написать собственное дополнение в С++ и использовать потоки для этого

Важно то, что вам нужен стек для частого разворачивания в вашем потоке V8, чтобы цикл событий имел возможность обрабатывать события как можно чаще. И имейте в виду, что, когда у вас длинное вычисление, которое занимает 10 секунд, и вы делите его на 1000 небольших частей, ваш сервер будет по-прежнему блокироваться от обслуживания новых запросов или любого другого ввода-вывода или события 1000 раз в течение 10 мс каждый раз.

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

Ответ 2

Одиночный поток не означает, что процессы будут запланированы First First Service. Я серьезно не думаю, что обрабатываются несколько запросов. Сначала приступайте к первому подарочному стилю, так что это не будет большой проблемой. Общая система будет замедляться из-за запросов, которые слишком долго обрабатываются.

И для этого node имеет решение:

https://nodejs.org/api/cluster.html

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