Node.js на многоядерных машинах - PullRequest
562 голосов
/ 05 марта 2010

Node.js выглядит интересно, НО Я должен что-то упустить - разве Node.js не настроен для работы только в одном процессе и потоке?Тогда как это масштабируется для многоядерных процессоров и серверов с несколькими процессорами?В конце концов, это все замечательно - это сделать как можно быстрее однопоточный сервер, но для высоких нагрузок я бы хотел использовать несколько процессоров.То же самое относится и к ускорению приложений - кажется, сегодня используется только несколько процессоров и распараллеливание задач.

Как Node.js вписывается в эту картину?Это его идея как-то распределить несколько экземпляров или как?

Ответы [ 15 ]

5 голосов
/ 24 мая 2010

Я использую Node worker для простого запуска процессов из моего основного процесса. Кажется, работает отлично, пока мы ждем официального пути.

2 голосов
/ 22 ноября 2016

Модуль cluster позволяет вам использовать все ядра вашей машины. Фактически, вы можете воспользоваться этим всего за 2 команды и не трогая свой код, используя очень популярный менеджер процессов pm2 .

npm i -g pm2
pm2 start app.js -i max
1 голос
/ 20 сентября 2018

Вы можете запустить ваше приложение node.js на нескольких ядрах, используя модуль cluster в сочетании с модулем os , который можно использовать для определения количества имеющихся у вас процессоров.

Например, давайте представим, что у вас есть модуль server, который запускает простой http-сервер на бэкэнде, и вы хотите запустить его для нескольких процессоров:

// Dependencies.
const server = require('./lib/server'); // This is our custom server module.
const cluster = require('cluster');
const os = require('os');

 // If we're on the master thread start the forks.
if (cluster.isMaster) {
  // Fork the process.
  for (let i = 0; i < os.cpus().length; i++) {
    cluster.fork();
  }
} else {
  // If we're not on the master thread start the server.
  server.init();
}
0 голосов
/ 10 ноября 2011

Можно масштабировать NodeJS на несколько блоков, используя чистый балансировщик нагрузки TCP (HAProxy) перед несколькими блоками, запускающими по одному процессу NodeJS каждый.

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

0 голосов
/ 12 апреля 2010

Также возможно спроектировать веб-сервис как несколько автономных серверов, которые слушают сокеты Unix, так что вы можете перенести функции, такие как обработка данных, в отдельные процессы.

Это похоже на большинство архитектур веб-серверов scrpting / database, где процесс cgi обрабатывает бизнес-логику, а затем отправляет и извлекает данные через сокет unix в базу данных.

разница в том, что обработка данных записывается как веб-сервер узла, прослушивающий порт.

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

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