Как лучше обойти «засыпание» хостинга для cron-задач Node Js приложения?
По вводным: делаю небольшое API приложени на node js + node-crone + prisma + mysql. Одной из функций в этом API является установка времени напоминания через приложение-клиент (Telegram Mini App).
По вводным: в базе данных в одной из таблиц хранится время отправки сообщения. Крон проходит по этой таблице каждую минуту и отбирает соответсвующих пользователей и добавляет их в таблицу очереди.
По вводным: из очереди скрипт отбирает записи по одной и отправляет сообщения пользователям.
Сейчас ситуация такая: столкнулся с проблемой: если к API не обращаться 5 минут, то приложение засыпает. Соответсвенно крон не добавляет задачи в очередьи задачи в очереди не обрабатываются.
Сейчас ситуация такая: подскажите, как правильно оргпнизовать структуру такого API-приложения, а именно: работа node-cron не зависимо от спячки приложения и обработка очереди.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Если хостинг «засыпает» и из-за этого cron-задачи Node.js не выполняются стабильно, лучший вариант — не пытаться будить его костылями, а вынести cron туда, где процесс действительно живет постоянно: VPS, worker-платформа, системный cron, очередь задач или внешний scheduler. Бесплатные/дешевые PaaS часто специально усыпляют приложения без трафика.
Есть несколько рабочих вариантов:
Для VPS базовая схема может выглядеть так:
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
Если задача внутри самого 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(); });
Для надежности добавьте логирование старта/окончания задачи, защиту от параллельного запуска и хранение статуса в базе. Если задача критичная, не используйте «пинги для пробуждения» как основное решение: они могут нарушать правила хостинга и всё равно не дают гарантии выполнения.