Исправление бесконечного цикла Email‑Cron в монорепо Next.js (и усиление безопасности) ТЛ;ДР: Я обнаружил, что ежемесячный cron электронной почты застрял в бесконечном цикле из-за переполнения setTimeout. Путем рефакторинга логики планирования и добавления...
Исправление бесконечного цикла Email-Cron в монорепозитории Next.js (и усиление безопасности)
ТЛ;ДР:
Я обнаружил, что ежемесячный cron электронной почты застрял в бесконечном цикле из-за переполнения setTimeout. Благодаря рефакторингу логики планирования и добавлению надлежащих средств защиты от переполнения cron теперь запускается, как и предполагалось, раз в месяц, а репозиторий также обновляется до Next16.3.4 со всеми исправленными уязвимостями высокой серьезности.
Проблема
Наша SaaS-платформа ежемесячно отправляет сводное электронное письмо каждому активному арендатору. Задание запускается специальной реализацией cron, расположенной в файле apps/api/src/email/email.cron.ts. После планового развертывания 3 сентября 2026 г. в журналах начался спам:
[cron] Запуск ежемесячной рассылки электронной почты...
[cron] Обработано 0 пользователей, следующий пакет через 0 мс
[cron] Обработано 0 пользователей, следующий пакет через 0 мс
...
Крон так и не продвинулся дальше первого пакета, и через несколько минут процесс Node достиг максимального размера стека вызовов. Основной причиной было переполнение при вычислении задержки setTimeout, которое в конечном итоге разрешилось до 0, что привело к немедленному запуску следующей итерации без выхода из цикла.
Что я попробовал в первую очередь
Моим первым побуждением было исправить переполнение, ограничив задержку минимум 1000 мс:
минусы