Подтвердить что ты не робот

Каков оптимальный способ запуска API Node в Docker на Amazon ECS?

С появлением докеров и служб планирования и оркестровки, таких как Amazon ECS, я пытаюсь определить оптимальный способ развертывания моего API Node. В стороне от Docker и ECS я хотел воспользоваться библиотекой кластера Node, чтобы изящно обрабатывать сбой приложения Node в случае асинхронной ошибки, как предложено в документации, создав мастер-процесс и несколько рабочих процессоров.

Одним из преимуществ кластерного подхода, помимо грамотной обработки ошибок, является создание рабочего процессора для каждого доступного ЦП. Но имеет ли это смысл в мире докеров? Имеет ли смысл иметь несколько процессов Node, запущенных в одном контейнере докеров, который будет масштабироваться в кластер экземпляров EC2 в ECS?

Без кластерного подхода Node я бы потерял способность изящно обрабатывать ошибки, поэтому я думаю, что, как минимум, я должен запустить мастер и один рабочий процесс на контейнер докеров. Я все еще запутался относительно того, сколько CPU определит в определении задачи для ECS. В документации ECS говорится о каждом экземпляре контейнера, имеющем 1024 единицы на процессор; но это не то же самое, что и вычислительные единицы EC2, не так ли? И с учетом сказанного мне нужно было бы выбрать типы экземпляров EC2 с соответствующим количеством vCPU для достижения этого права?

Я понимаю, что для достижения оптимальной конфигурации может потребоваться некоторый уровень бенчмаркинга моего конкретного приложения API Node, но было бы замечательно иметь представление о том, с чего начать. Может быть, есть некоторые исследования/исследования, которые мне нужно сделать? Любые указатели, которые будут вести меня по пути или рекомендациям, будут наиболее ценными!

Изменить: повторить мои конкретные вопросы:

  • Имеет ли смысл запустить кластер мастеров/рабочих, описанный здесь внутри контейнера докера, чтобы добиться изящного сбоя?

  • Имеет ли смысл использовать почти идентичный код, как описано в документах кластера, для "масштабирования" доступных процессоров через require('os').cpus().length?

  • Что означает Amazon в документации для определений задач ECS, где указано для параметра cpus, что a container instance has 1024 units per CPU? И что было бы хорошей отправной точкой для этой настройки?

  • Что было бы хорошей отправной точкой для типа экземпляра для кластера ECS, предназначенного для обслуживания API Node на основе вышеизложенного? И как влияют на доступные vCPU на предыдущие вопросы?

4b9b3361

Ответ 1

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

Однопроцессорный контейнер является скорее предложением, чем жестким и быстрым. Это прекрасно, чтобы запускать несколько процессов в контейнере, когда вы используете его, особенно в этом случае, когда мастер-процесс виляет рабочих. Просто используйте один контейнер и разрешите ему развить один процесс на ядро, как вы предложили в вопросе.

В EC2 типы экземпляров имеют несколько vCPU, которые будут отображаться как ядро ​​ОС. Для кластера ECS используйте тип экземпляра EC2, такой как c3.xlarge с четырьмя vCPU. В ECS это переводится в 4096 единиц ЦП. Если вы хотите, чтобы приложение использовало все 4 vCPU, создайте определение задачи, которое требует 4096 единиц процессора.

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

Ответ 2

Это похоже на действительно хороший образец. Это похоже на то, что сделано с Erlang/OTP, и я не думаю, что кто-то будет утверждать, что это одна из самых надежных систем на планете. Теперь вопрос заключается в том, как реализовать.

Я бы использовал шаблоны из Heroku или других подобных систем PaaS, которые имеют немного более зрелость. Я не говорю, что амазонка - это не то, что нужно сделать, но просто так много работы было сделано в других областях, которые вы можете перевести. Например, в этой статье есть рецепт: https://devcenter.heroku.com/articles/node-cluster

Что касается отношений между vCPU и вычислительными единицами, то это выглядит как прямое соотношение 1/1024. Это переход к микрозарядам на основе использования ЦП. Они занимаются этим еще дальше с работой лямбды. Они заряжают вас, основываясь на доли секунды, которые вы используете.

Ответ 3

В мире докеров вы будете запускать 1 nodejs на контейнер докеров, но вы будете запускать много таких контейнеров на каждом из ваших экземпляров ec2. Если вы используете что-то вроде fig, вы можете использовать fig scale <n> для запуска множества избыточных контейнеров экземпляра. Таким образом, вам не нужно определять счетчик nodejs раньше времени, и каждый из ваших процессов nodejs изолирован от других.