Node.js Recipes
3.23K subscribers
173 photos
7 videos
1 file
610 links
Download Telegram
​​Как использовать cron в Node.js?
#kubernetes #service #nestjs

Есть много бизнес задач делать что-то по расписанию. Для этого используют утилиту cron, а расписание описывают crontab выражением. Пример: задача – отправлять отчет на емейл каждый день в 3 часа ночи, график – 0 3 * * *. Разобраться с crontab поможет сервис crontab.guru

Реализовывать cron в #nodejs проекте можно по разному:
Cron вызов REST API. Потерян контроль, найти ошибку будет сложно.
Использование setInterval/setTimeout. Оставьте это авторам библиотек, сфокусируйтесь на бизнес домене.
⚠️На уровне кода cron можно реализовать одноименным пакетом. В Nest.js есть @nestjs/schedule. Стоить учесть, что только один Node.js процесс должен запускать cron, иначе приложение теряет масштабируемость. Решается введением master process.

На уровне операционной системы. Встроенный OS cron будет вызывать Node.js как CLI утилиту. Хорошо в виртуальных машинах, противопоказано внутри Docker контейнеров (избегайте порождающих процессов).
Для этого используем не библиотеку аля yargs, а cli-framework (см. clipanion и его аналоги).
Для Nest.js есть пакеты nestjs-command и nestjs-console.

Cloud Native подход. Зависит от облака и требуемого способа запуска (serverless или docker). Смотрим документацию облака и консультируемся с DevOps инженером.

Kubernetes native подход:
➡️Cron на уровне кода, но его запуск только в одной реплике. Используется StatefulSets, а мастер реплика определяется через _0 postfix. Подробней
➡️Cron на уровне кода, но вынесен в отдельный Deployment с одной репликой.
➡️Если же задачи ресурсоемкие, то правильно использовать CronJob.

Выбирайте решение на правильном уровне!
Как и зачем настраивать healthchecks/probes?
#kubernetes #cloud

В реальных проектах трафик, который идет на Node.js приложение сначала проходит через какой-то из инфраструктурных элементов. Это могут быть load balancer, API Gateway, оркестратор (kubernetes/Docker Swarm) и т.д. Кроме маршрутизации трафика инфраструктура отвечает за перезапуск и масштабирование приложения. Для этого ей необходимо сообщить, что приложение работает с помощью healthcheck. Инструментов много, поэтому рецепт рассматривает healthcheck только для kubernetes. В остальных инструментах принципы и реализация аналогичны.

Как правило healthcheck это конкретный http endpoint, который отдает 200 если приложение работает. Он может проверять доступность зависимостей, памяти, процессора и т.п. В Nest.js для этого используется terminus. В kubernetes помимо http healtcheck можно настроить tcp или bash команду – может быть полезно для worker-ов без http.

Kubernetes позволяет сконфигурировать несколько видов healthcheck. В документации они еще называются probes. Рассмотрим каждый из них:
– Liveness показывает, что контейнер работает. Если не будет 200 ответа, то Kubernetes перезапустит контейнер.
– Readiness показывает, что контейнер доступен для трафика. Если не будет 200 ответа, то Kubernetes не будет отправлять на него запросы. Пример из реального проекта – WS сервер отдавал 200 ответ пока не количество подключений не превышало лимит.
– Startup показывает, что контейнер успешно запустился. Редко используется для Node.js приложений, так как спроектирован для долго запускающихся контейнеров.

Ссылки по теме:
🔗 The Twelve-Factor App
🔗 Configure Liveness, Readiness and Startup Probes
🔗 Kubernetes Liveness and Readiness Probes: How to Avoid Shooting Yourself in the Foot
🔗 Liveness probes в Kubernetes могут быть опасны