Node.js выглядит интересно, НО я должен что-то упустить - разве Node.js не настроен только на один процесс и поток?
Тогда как это масштабируется для многоядерных процессоров и серверов с несколькими процессорами? В конце концов, это все замечательно - это сделать как можно быстрее однопоточный сервер, но для высоких нагрузок я бы хотел использовать несколько процессоров. То же самое относится и к ускорению приложений - сегодня кажется, что путь заключается в использовании нескольких процессоров и распараллеливании задач.
Как Node.js вписывается в эту картину? Его идея как-то распространять несколько экземпляров или как?
javascript
node.js
node-cluster
zaharpopov
источник
источник
Ответы:
[ Это сообщение актуально по состоянию на 2012-09-02 (новее, чем указано выше). ]
Node.js действительно масштабируется на многоядерных машинах.
Да, Node.js - один поток на процесс. Это очень обдуманное проектное решение, устраняющее необходимость иметь дело с семантикой блокировки. Если вы не согласны с этим, вы, вероятно, еще не понимаете, насколько безумно сложно отлаживать многопоточный код. Для более глубокого объяснения модели процесса Node.js и почему она работает таким образом (и почему она НИКОГДА не будет поддерживать несколько потоков), прочитайте мой другой пост .
Итак, как мне воспользоваться преимуществами моего 16-ядерного блока?
Два пути:
Масштабирование пропускной способности на веб-сервисе
Начиная с версии 6.0.X Node.js включил модуль кластера прямо из коробки, что упрощает настройку нескольких рабочих узлов, которые могут прослушивать один порт. Обратите внимание, что это НЕ то же самое, что более старый модуль "cluster" learnboost, доступный через npm .
Рабочие будут бороться за принятие новых подключений, и, скорее всего, победит наименее загруженный процесс. Он работает довольно хорошо и может увеличить пропускную способность на многоядерном процессоре.
Если у вас достаточно нагрузки, чтобы позаботиться о нескольких ядрах, вы захотите сделать еще несколько вещей:
Запустите службу Node.js за веб-прокси, таким как Nginx или Apache - что-то, что может регулировать соединение (если вы не хотите, чтобы условия перегрузки приводили к полному отключению), переписывать URL-адреса, обслуживать статический контент и прокси-сервер других вспомогательных служб.
Периодически перерабатывайте ваши рабочие процессы. Для длительного процесса даже небольшая утечка памяти в конечном итоге приведет к увеличению.
Настройка сбора журналов / мониторинга
PS: Есть обсуждение между Аароном и Кристофером в комментариях к другому посту (на момент написания статьи это самый верхний пост). Несколько комментариев по этому поводу:
Общие порты:
nginx (port 80) --> Node_workers x N (sharing port 3000 w/ Cluster)
против
Индивидуальные порты:
nginx (port 80) --> {Node_worker (port 3000), Node_worker (port 3001), Node_worker (port 3002), Node_worker (port 3003) ...}
Возможно, есть некоторые преимущества в настройке отдельных портов (возможно меньшая связь между процессами, более сложные решения по распределению нагрузки и т. Д.), Но это определенно больше работы для настройки, а встроенный модуль кластера требует мало -сложная альтернатива, которая работает для большинства людей.
источник
Одним из методов может быть запуск нескольких экземпляров node.js на сервере, а затем установка балансировщика нагрузки (предпочтительно неблокирующего, такого как nginx) перед ними.
источник
Райан Даль отвечает на этот вопрос в техническом докладе, который он дал в Google прошлым летом. Перефразируя, «просто запустите несколько узловых процессов и используйте что-то разумное, чтобы позволить им обмениваться данными. Например, IPC в стиле sendmsg () или традиционный RPC».
Если вы хотите испачкать руки, проверьте модульspark2Forever . Это упрощает порождение процессов с несколькими узлами. Он управляет настройкой общего доступа к портам, поэтому каждый из них может принимать подключения к одному и тому же порту, а также автоматически перезапускается, если вы хотите убедиться, что процесс перезапускается, если / когда он умирает.ОБНОВЛЕНИЕ - 10/11/11 : Консенсус в сообществе узлов, похоже, заключается в том, что кластер в настоящее время является предпочтительным модулем для управления несколькими экземплярами узлов на одном компьютере. Навсегда тоже стоит посмотреть.
источник
Вы можете использовать кластерный модуль. Проверьте это .
источник
Многоузловая система использует все имеющиеся у вас ядра.
Посмотрите на http://github.com/kriszyp/multi-node .
Для более простых нужд вы можете запустить несколько копий узла на разных номерах портов и поставить балансировщик нагрузки перед ними.
источник
Узел Js поддерживает кластеризацию, чтобы использовать все преимущества вашего процессора. Если вы не используете его с кластером, то, вероятно, вы тратите свои аппаратные возможности.
Кластеризация в Node.js позволяет создавать отдельные процессы, которые могут использовать один и тот же порт сервера. Например, если мы запустим один HTTP-сервер на порту 3000, это будет один сервер, работающий в одном потоке на одном ядре процессора.
Код, показанный ниже, позволяет кластеризовать ваше приложение. Этот код является официальным кодом, представленным Node.js.
проверьте эту статью для полного урока
источник
Как упоминалось выше, Cluster будет масштабировать и распределять нагрузку на ваше приложение по всем ядрам.
добавив что-то вроде
Перезапустит любых провальных работников.
В наши дни многие люди также предпочитают PM2 , который обрабатывает кластеризацию для вас, а также предоставляет некоторые интересные функции мониторинга .
Затем добавьте Nginx или HAProxy перед несколькими компьютерами, работающими с кластеризацией, и у вас будет несколько уровней отработки отказа и гораздо более высокая нагрузочная способность.
источник
Будущая версия узла позволит вам раскошелиться на процесс и передать ему сообщения, и Райан заявил, что хочет найти какой-то способ обмена файловыми обработчиками, так что это не будет прямой реализацией Web Worker.
В настоящее время для этого нет простого решения, но оно все еще очень рано, и node - один из самых динамичных проектов с открытым исходным кодом, которые я когда-либо видел, поэтому ожидайте чего-то удивительного в ближайшем будущем.
источник
Spark2 основан на Spark, который больше не поддерживается. Кластер является его преемником, и у него есть несколько интересных функций, таких как создание одного рабочего процесса на ядро процессора и восстановление мертвых рабочих.
источник
Я использую Node worker для простого запуска процессов из моего основного процесса. Кажется, работает отлично, пока мы ждем официального пути.
источник
Новый ребенок на блоке здесь - «Up» в LearnBoost .
Он обеспечивает «перезагрузки с нулевым временем простоя» и дополнительно создает несколько рабочих (по умолчанию количество процессоров, но оно настраивается), чтобы обеспечить лучшее из всех миров.
Он новый, но, кажется, довольно стабильный, и я успешно использую его в одном из моих текущих проектов.
источник
Модуль кластера позволяет вам использовать все ядра вашей машины. Фактически, вы можете воспользоваться этим всего за 2 команды, не касаясь своего кода, используя очень популярный менеджер процессов pm2 .
источник
Вы можете запустить ваше приложение node.js на нескольких ядрах, используя модуль кластера в сочетании с модулем os, который можно использовать для определения того, сколько у вас процессоров.
Например, давайте представим, что у вас есть
server
модуль, который запускает простой http-сервер на сервере, и вы хотите запустить его для нескольких процессоров:источник
Также возможно спроектировать веб-сервис как несколько автономных серверов, которые слушают сокеты Unix, так что вы можете использовать такие функции, как обработка данных, в отдельных процессах.
Это похоже на большинство архитектур веб-серверов scrpting / database, где процесс cgi обрабатывает бизнес-логику, а затем передает и извлекает данные через сокет unix в базу данных.
разница в том, что обработка данных записывается как веб-сервер узла, прослушивающий порт.
это более сложно, но в конечном итоге это то, куда должна идти разработка многоядерности. многопроцессная архитектура, использующая несколько компонентов для каждого веб-запроса.
источник
Можно масштабировать NodeJS до нескольких блоков, используя чистый балансировщик нагрузки TCP (HAProxy) перед несколькими блоками, запускающими по одному процессу NodeJS каждый.
Если у вас есть общие знания, которыми вы можете поделиться между всеми экземплярами, вы можете использовать центральное хранилище Redis или подобное, к которому можно получить доступ из всех экземпляров процесса (например, из всех блоков).
источник