Node.js — это асинхронная среда выполнения JavaScript, управляемая событиями, используемая для создания масштабируемых систем. Благодаря неблокирующему характеру выполнения кода разработчики выбирают Node для создания масштабируемых систем. Почти ни одна функция в Node.js напрямую не выполняет ввод-вывод, поэтому процесс никогда не блокируется. Поскольку ничто не блокирует, масштабируемые системы очень разумно разрабатывать на Node.js.

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

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

Модуль Node.js Cluster дает нам инструменты для одновременного создания дочерних процессов в зависимости от доступных системных ресурсов.

Возьмем простой пример: у меня есть простое экспресс-приложение с запросом GET API. Цикл for занимает довольно много времени, просто чтобы быть реалистичным, я слишком максимальные итерации, чтобы быть 5000000000.

Запрос GET хорошо работает для небольших значений n. Как показано ниже для n = 50, все работает нормально.

Но для n=5000000000 обработка занимает много времени. Он блокирует другие маленькие или большие запросы. До тех пор, пока Node.js не выполнит этот процесс ошибки, он не начнет обрабатывать другие запросы. Как показано ниже, мы видим, что оба запроса обрабатываются, что занимает разумное количество времени.

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

Здесь я добавил дополнительную строку кода, где я проверяю количество ядер в моей системе. мы создаем несколько дочерних процессов, которые будут совместно использовать порт 3000 и смогут обрабатывать запросы, отправленные на этот порт. Рабочие процессы создаются с помощью метода child.process.fork(). Метод возвращает объект ChildProcess со встроенным каналом связи, который позволяет передавать сообщения туда и обратно между дочерним процессом и его родителем.

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

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

Модуль кластеров Node Js — это удивительный модуль, созданный для оптимизации производительности вашего приложения. Это помогает нам распределять нагрузку запросов на разные ресурсы для эффективной работы. Недавно я наткнулся на этот модуль и понял насколько он важен и полезен. Я просто хотел поделиться своими взглядами на это.

Для получения дополнительных знаний читайте: h ttps://blog.appsignal.com/2021/02/03/improving-node-application-performance-with-clustering.html