Как правильно масштабировать приложение nodejs на heroku с помощью кластеров

В последнее время я заметил предупреждение в журналах heroku, которое показалось мне новым.

web.1: обнаруженная доступная память объемом 512 МБ, ограничение по 512 МБ для каждого процесса (WEB_MEMORY)

web.1: Рекомендация WEB_CONCURRENCY = 1

Я провел некоторое исследование и нашел эту кластерную статью , которая является "стандартным" способом использования кластеров в nodejs, но это полностью противоречит недавно обновленная статья, которая содержит эту новую переменную среды WEB_CONCURRENCY и с другим предложением размера для каждого дино (что намного меньше, бит/т)

Ответ 1

Первая ссылка - с июля 2014 года и использовалась как рекомендуемый способ сделать что-то. Однако динамики Heroku довольно ориентированы на память, и при использовании максимального количества ядер на процессор (как следует из первой статьи) очень легко превысить выделенное количество памяти.

Вместо этого новая рекомендация - профилировать ваше приложение и выяснить, сколько памяти требуется для каждого процесса. Задайте для этого значения переменную среды WEB_MEMORY, а затем обновите код кластера следующим образом:

var cluster = require('cluster');
var numWorkers = process.env.WEB_CONCURRENCY;

if(cluster.isMaster) {
  // Master process: fork our child processes
  for (var i = 0; i < numWorkers; i++) {
    cluster.fork();
  }

  // Respawn any child processes that die
  cluster.on('exit', function() {
    cluster.fork();
  });

} else {
  // Child process, put app initialisation code here.
}

Используя переменную WEB_MEMORY, Heroku может генерировать значение WEB_CONCURRENCY в зависимости от размера выполняемого вами динамометра и, следовательно, форсировать правильное количество процессов, чтобы убедиться, что ваше приложение не превышает допустимый объем памяти.

В стороне, если вы превысите выделение памяти (512 МБ на дино для 1x дино), для избытка будет использовано место подкачки. Это замедлит ваше приложение, увеличив время запроса и, как правило, вносит вклад в медлительность. Если вы превысите объем памяти слишком много (примерно в три раза больше распределения), Heroku перезапустит ваш dyno.