Docker-контейнеры и Node.js-кластеры
У меня есть сервер API под управлением Node.js, который использовал свой кластерный модуль, и тестирование выглядело довольно хорошо. Теперь наш ИТ-отдел хочет перейти на использование контейнеров Docker, что меня радует, но я никогда не использовал его, кроме как просто поиграл. Но у меня возникла мысль, что приложение Node.js запускается в рамках одного процесса Docker, поэтому кластерный модуль на самом деле не будет лучшим, так как отдельный процесс Docker может быть медленной точкой установки до тех пор, пока запрос не будет разделен внутри этого процесса. модулем кластера.
Итак, действительно ли кластер Docker-контейнеров, работающих с возможностью запускать и останавливать их на лету, важнее, чем правильно использовать кластерный модуль Node.js?
Если у меня есть кластер контейнеров, получит ли что-нибудь использование кластерного модуля Node.js? Конечные точки API возвращаются менее чем за 5 секунд (обычно немного меньше).
Я использую MySQL (полагаю, что это единственный сервер, ничего более в настоящее время), поэтому не должно быть никаких причин использовать решение для обеспечения целостности данных.
2 ответа
Вы должны будете измерить, чтобы быть уверенным, но моя догадка будет работать с кластерным модулем узла, и это того стоит. Это позволит вам увеличить нагрузку на процессор при минимальных затратах. Нет дополнительных контейнеров для управления (запуск, остановка, мониторинг). Плюс работники кластера имеют эффективный коммуникационный механизм. Наиболее разумная эволюция (не пропустите шаги) показалась бы мне:
- 1 контейнер, 1 процесс узла
- 1 контейнер, несколько кластерных рабочих узлов
- несколько контейнеров, каждый с несколькими рабочими узла
То, что я видел как лучшее решение при использовании Docker, - это сохранить как можно меньше процессов на контейнер, так как контейнеры легки; Вы не хотите, чтобы процессы пытались использовать более одного процессора. Таким образом, запуск кластера в контейнере не добавит никакого значения и может ухудшить задержку.
Здесь https://medium.com/@CodeAndBiscuits/understanding-nodejs-clustering-in-docker-land-64ce2306afef Чед Робинсон объясняет идею в общих чертах.
Kubernetes, Rancher, Mesos и другие уровни управления контейнерами управляют балансировкой нагрузки. Они обеспечивают "планирование" (перемещение этих контейнерных срезов Docker вокруг разных ЦП и машин для эффективного использования в кластере) и "сетевое" (балансировка нагрузки входящих запросов к этим контейнерам) внутри.
Обновить
Я думаю, что стоит добавить ссылку Почему рекомендуется запускать только один процесс в контейнере? где люди делятся своими идеями и опытом, но в основном от tbreffni есть несколько интересных моментов:
При условии, что вы возлагаете единственную ответственность (отдельный процесс, функцию или задачу) на контейнер: хорошая идея, Докер называет эту "заботу";)
- Масштабирование контейнеров по горизонтали проще.
- Он может быть повторно использован в разных проектах.
- Выявление проблем и устранение неисправностей - проще простого по сравнению со всей средой приложений. Кроме того, регистрация и отчетность могут быть более точными и подробными.
- Улучшения / понижения можно постепенно и полностью контролировать.
- Безопасность может применяться к конкретным ресурсам и на разных уровнях.
У меня есть система с 4 логическими ядрами, и я запустил следующую строку на моем компьютере, а также на докере, установленном на том же компьютере.
const numCPUs = require('os').cpus().length;
console.log(numCPUs)
Эти строки печатают 4 на моей машине и 2 внутри контейнера докеров. Это означает, что если мы используем кластеризацию в контейнере докеров, будет запущено только 2 экземпляра. Таким образом, док-контейнер не видит ядра так же, как на самом деле. Также запуск 5 контейнеров докеров с включенным режимом кластеризации дает 10 экземпляров машины, которые в конечном итоге управляются ядром ОС с 4 логическими ядрами.
Поэтому я думаю, что лучший подход - использовать несколько экземпляров контейнера докеров в режиме роя с отключенной кластеризацией node.js. Это должно дать наилучшую производительность.