Serhioromano
@Serhioromano
Web Developer

Как лучше организовать микросевисы основанных на Docker написанных на node.js?

Есть программа или скажем Облачная служба которая опрашивает устройства по разным протоколам и получает с них данные. Далее или отображает, или архивирует, анализирует, визуализирует и т.д. Приложение работает на службах AWS в вычислительном кластере. Все добавленные устройства, графики и т.д. организуются в пределах одного проекта. То есть, пользователь зашел, создал проект, добавил устройство к проекту и далее.

Каждый созданный пользователем проект будет запускать контейнер докера с ноуд на нем, который будет опрашивать устройства. Например пользователь создал устройства и установил частоту опроса в 2000 миллисекунд. Мы получим что то типа

setInterval(function(){
    // опрасить устройство
    // сохранить данные в базе
}, 2000);


Но один проект может иметь несколько устройств. Одни могут быть запущены, другие нет. Так что при запуске устройства мы добавляем в базу данных задачу на запуск или остановку опроса или других микро задач. А наш ноуд контейнер будет опрашивать таблицу задач раз в 20 секунд например и исполнять.

Таким образом между сервером АПИ и контейнером проекта не будет прямой связи, и контейнер проекта будет полностью изолирован и все порты на вход будут закрыты.

К слову база данных это служба AWS RDS так что доступ к ней всегда будет внутри VPC.

Вопросы

1. Я на правильном пути?
2. Какие есть инструменты или скажем пакеты npm что бы запускать небольшие циклические задача, и останавливать а так же следить за их состоянием. Просто не знаю какие ключевые слова тут использовать что бы начать поиск.
3. Проект может содержать 100 устройств а каждое устройство от 1 до 100 каналов опроса. Это значит до (а может и больше) 1000 маленьких процессов опроса типа как пример я привел. Правильно ли запускать контейнер на проект или лучше запустить контейнер на устройство? Я вижу преимущество в контейнере на устройство в том, что если будет проблема с опросом устройства это не отразиться на других устройствах. И будет просто включить выключить, просто запустить или остановить контейнер. Но вижу недостаток в том, что будет очень много контейнеров в кластере и переживаю, что много ресурсов будут съедать сами контейнеры.
  • Вопрос задан
  • 132 просмотра
Пригласить эксперта
Ответы на вопрос 1
inoise
@inoise Куратор тега Amazon Web Services
Solution Architect, AWS Certified, Serverless
по контейнеру на одну таску может быть дорого даже при Fargate. Я бы перестал заниматься фигней и взял AWS StepFunctions c Wait:
idle-coldstart-01-1024x547.png

Создаем StepFunctions джобу с параметрами и инвокаем из нее Lambda в цикле. Все, никаких проблем не будет. Надо только учитывать что у решения лимит исполнения - 1 год, вроде. Дальше - пересоздавать.

Надо считать во-сколько это встанет, конечно. На Step Functions одна такая Джоба в месяц около 20$ может встать (10$ на SF и 10$ на Lambda), без необходимости дополнительного управления. Сохранять можно куда охота - хоть в CloudWatch, хоть куда потребуется.

Для сравнения - в минимуме на ECS + Fargate это выйдет в 10$ (если ресурсов хватит), но надо контролировать где-то дополнительно что все работает, инфраструктуру и вообще. Я бы переплатил за первый вариант
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы