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

    Последние полгода я занимаюсь разработкой достаточно большого 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
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 18

      0
      ошибки воркеров отлавливает и пишет в лог?
      а вообще, вроде добротная штука
        0
        Сейчас пишет в лог все, что выводит приложение. Если вы будете выводить в консоль ошибки, то они, конечно попадут в лог.
          0
          а если воркер упадет с эксепшном?
            0
            Тогда ошибка попадет в лог. Туда перенаправляется весь stdout от всех воркеров. Ну и clusterize перезапустит воркер.
        0
        А в чем отличия от nodejs.org/api/cluster.html#cluster_how_it_works?
          +1
          По-моему, не нужно писать доп. код для управления кластером.
          Т.е. установил модуль и все работает на нескольких ядрах.
            +1
            «node-clusterize-cli» — это утилита работающая из командной строки, не затрагивающая кода приложения. Она основывается именно на оригинальном модуле «cluster» NodeJS.
              0
              Предлагаю это написать где-то под заголовком, ленивые нынче люди пошли
                0
                Но я решил не останавливаться на этом, и сделать удобный CLI для работы с кластером, чтобы отвязать код, который отвечает за запуск кластера от конкретного приложения. Кроме того, очень хотелось демонизировать кластер, чтобы он висел себе молча в процессах, поднимал упавшие воркеры, писал в логи, и никого больше не отвлекал.


                Не то? На всякий случай добавил еще, рядом со ссылкой.
                  0
                  Нет, все хорошо. Спасибо.
            0
            **Комментарий удален**
            +1
            Но есть же pm2…
            github.com/Unitech/pm2
              0
              Буду знать, спасибо! Я старался сделать очень простое решение, которое ближе к `forever` и `supervisor`.
              0
              Похоже на luster, но luster с плюшками.
                0
                Пытаюсь поставить:

                $ npm i -g node-clusterize-cli
                npm ERR! Error: shasum check failed for /home/sluice/tmp/npm-11089-v8IcLGsg/1389709030037-0.4753906512632966/tmp.tgz
                npm ERR! Expected: f2df443adb360d2558704ac66776a558cf080149
                npm ERR! Actual: aafdf105ab6c0a760c0e9c9dcf9eeb22cfdec775
                  0
                  вроде как ошибка контрольных сумм, разве нет? при чем тут, собственно, мы? перекачайте
                    +1
                    На самом деле, это баг ноды или npm. В какой-то недавней версии у них была проблема с корректным расчетом sha-суммами. Попробуйте обновить node и npm.

                    В npm есть открытые и закрытые ишью по этой проблеме

                Only users with full accounts can post comments. Log in, please.