13 January 2014

Кластеризация nodejs web-сервера с помощью node-clusterize-cli

Website developmentNode.JS
Последние полгода я занимаюсь разработкой достаточно большого web-приложения, под капотом которого ревет и дымится NodeJS. Когда дело дошло до деплоя на продакшн я задумался: «почему бы мне не использовать несколько тредов с инстансом приложения?».

Реализовав кластер, я увидел, что производительность от его использования возросла в 1,5 раза, что очень даже не плохо, учитывая малый объем потраченных усилий. Но я решил не останавливаться на этом, и сделать удобный CLI для работы с кластером, чтобы отвязать код, который отвечает за запуск кластера от конкретного приложения. Кроме того, очень хотелось демонизировать кластер, чтобы он висел себе молча в процессах, поднимал упавшие воркеры, писал в логи, и никого больше не отвлекал.

Так появился node-clusterize-cli — утилита работающая из командной строки, не затрагивающая кода приложения. Основанная на оригинальном модуле «cluster» NodeJS.


Механизм работы

Модуль устроен просто — для начала он запускает мастер-процесс, в котором стартует то количество воркеров, которое вам необходимо (по-умолчанию, по два процесса на ядро), а затем отвязывает мастер-процесс от CLI интерфейса и оставляет его работать аки демона. Кроме того, мастер-процесс слушает сообщения об ошибках, которые могут произойти в воркерах, и автоматически перезапускает павших товарищей. За то, чтобы каждый запрос обрабатывался случайным процессом отвечает модуль из API NodeJS под названием «cluster».

Использование

В общем-то, все банально:

# Установка глобального модуля
$ npm i -g node-clusterize-cli
# Запуск кластера
$ clusterize --app ./app.js --workers 32 --log ./cluster.log


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

# фактически, алиас `ps -eo pid,comm | grep "clusterize master"`
$ clusterize list 
53416 app.js
# алиас на `kill -9 CLUSTER_PID`
$ clusterize kill 53416


Подробнее можно посмотреть в подсказке — clusterize -h и readme на GitHub.

репозиторий на GitHub
Логи нагрузочных тестов ab
Tags:node.jsclusteringclusterizationcli
Hubs: Website development Node.JS
+18
8.4k 78
Comments 18