Как лучше обойти «засыпание» хостинга для cron-задач Node Js приложения?

Ссылка скопирована
1 ответ

По вводным: делаю небольшое API приложени на node js + node-crone + prisma + mysql. Одной из функций в этом API является установка времени напоминания через приложение-клиент (Telegram Mini App).
По вводным: в базе данных в одной из таблиц хранится время отправки сообщения. Крон проходит по этой таблице каждую минуту и отбирает соответсвующих пользователей и добавляет их в таблицу очереди.
По вводным: из очереди скрипт отбирает записи по одной и отправляет сообщения пользователям.
Сейчас ситуация такая: столкнулся с проблемой: если к API не обращаться 5 минут, то приложение засыпает. Соответсвенно крон не добавляет задачи в очередьи задачи в очереди не обрабатываются.
Сейчас ситуация такая: подскажите, как правильно оргпнизовать структуру такого API-приложения, а именно: работа node-cron не зависимо от спячки приложения и обработка очереди.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Frontend-редакция Ответ

Если хостинг «засыпает» и из-за этого cron-задачи Node.js не выполняются стабильно, лучший вариант — не пытаться будить его костылями, а вынести cron туда, где процесс действительно живет постоянно: VPS, worker-платформа, системный cron, очередь задач или внешний scheduler. Бесплатные/дешевые PaaS часто специально усыпляют приложения без трафика.

Есть несколько рабочих вариантов:

  • VPS: Node-приложение под pm2/systemd и обычный cron;
  • serverless scheduler: Cloudflare Workers Cron Triggers, GitHub Actions schedule, Render Cron Jobs и аналоги;
  • внешний ping-сервис: только если нужно дергать HTTP endpoint, но это не всегда надежно;
  • очередь: BullMQ/Redis, если задачи должны переживать рестарты и выполняться гарантированно.

Для VPS базовая схема может выглядеть так:

npm install pm2 -g
pm2 start app.js --name my-node-app
pm2 save
pm2 startup

npm install pm2 -g pm2 start app.js --name my-node-app pm2 save pm2 startup

А cron пусть вызывает отдельный скрипт или HTTP endpoint:

*/15 * * * * /usr/bin/node /var/www/app/tasks/send-report.js >> /var/log/app-cron.log 2>&1

*/15 * * * * /usr/bin/node /var/www/app/tasks/send-report.js >> /var/log/app-cron.log 2>&1

Если задача внутри самого Node-приложения, используйте node-cron только при условии, что процесс гарантированно запущен. На засыпающем хостинге node-cron бесполезен: когда процесс остановлен, таймеры не работают.

import cron from 'node-cron';
 
cron.schedule('*/15 * * * *', async () => {
  await runTask();
});

import cron from 'node-cron'; cron.schedule('*/15 * * * *', async () => { await runTask(); });

Для надежности добавьте логирование старта/окончания задачи, защиту от параллельного запуска и хранение статуса в базе. Если задача критичная, не используйте «пинги для пробуждения» как основное решение: они могут нарушать правила хостинга и всё равно не дают гарантии выполнения.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно