Задачи по расписанию в serverless: полные cron-выражения, история и ретраи
Пайплайны с триггером по расписанию: cron-выражение проверяется при сохранении, каждый прогон попадает в консоль рядом с HTTP-вызовами, а ретраи настраиваются без отдельного планировщика.
Обновлено: 2026-06-28
Кратко
Суть ответа
Задачи по расписанию в serverless: полные cron-выражения, история и ретраи. Полные cron-выражения: 0 9 * * 1-5 работает. Выражение валидируется при сохранении — опечатка выявляется сразу. Лидер-выборы через advisory-lock в Postgres гарантируют: расписание срабатывает на одном узле, даже если воркеров несколько.
Когда подходит и когда нет
- Нужны полные cron-выражения, а не фиксированные интервалы
- Важны история прогонов и алерты на ошибки
На что обратить внимание
- CloudWatch Events и IFTTT не дают полной истории прогонов и контроля над ретраями.
- Без проверки cron-выражения при вводе опечатка запускает задачу не тогда, когда ожидалось — и обнаруживается только в продакшне.
Ситуация: нагрузка и где обычно ломается
Проблемы с расписаниями вне managed-платформ
- Crontab на VPS: вывод уходит в root mail, который никто не читает; при сбое нет повтора
- systemd timers: надёжнее запуск, но логи разрозненны, секреты вручную, истории нет
- Kubernetes CronJob: правильные примитивы, но кластерная нагрузка для небольших команд
Задачи по расписанию чаще других падают тихо: скрипт на VPS завершился с ошибкой, письмо попало в mail spool — и никто не узнаёт, пока данные не устареют на три дня.
Компромиссы
Когда простые планировщики не подходят
CloudWatch Events и IFTTT не дают полной истории прогонов и контроля над ретраями.
Без проверки cron-выражения при вводе опечатка запускает задачу не тогда, когда ожидалось — и обнаруживается только в продакшне.
Как Inquir помогает в этом сценарии
Что даёт Inquir для scheduled jobs
Полные cron-выражения: 0 9 * * 1-5 работает. Выражение валидируется при сохранении — опечатка выявляется сразу. Лидер-выборы через advisory-lock в Postgres гарантируют: расписание срабатывает на одном узле, даже если воркеров несколько.
Планировщик опрашивает каждые 30 секунд (минимальный интервал — 5 минут), поэтому срабатывание укладывается в ~30 с от запланированного времени. История каждого прогона — в консоли рядом с HTTP-вызовами; ретраи, таймауты и логи единые для всех триггеров.
Что вы получаете на платформе
Что входит в managed scheduled jobs
Валидация cron
Синтаксис cron-выражения проверяется при сохранении: следующий запуск показывается до применения.
История прогонов
Каждый запуск — запись с временем, статусом и логами.
Ретраи
Политика ретраев на уровне пайплайна — для задач, которые иногда падают из-за временных ошибок.
Секреты
Те же переменные окружения, что у HTTP-функций — меняются без редеплоя.
Что сделать дальше, по шагам
Как настроить расписание
Написать функцию-обработчик
Обработчик события scheduled: логика, которую нужно запускать по расписанию.
Создать пайплайн с cron-триггером
В настройках пайплайна выбрать schedule, ввести cron-выражение — сохранить.
Проверить в консоли
После первого срабатывания — история с логами и статусом прогона.
Пример кода
Nightly sync job with watermark
Scheduled handler reads cursor from environment, fetches incremental updates, upserts idempotently, and returns new cursor for the next run.
export async function handler(event) { // event.trigger?.type === 'schedule' when fired by a cronTrigger node const since = process.env.SYNC_CURSOR ?? new Date(Date.now() - 86_400_000).toISOString(); const records = await source.fetchUpdatedSince(since); if (records.length === 0) return { synced: 0, cursor: since }; await destination.upsertBatch(records); // idempotent by record ID const newCursor = records.at(-1)?.updatedAt ?? since; // Store cursor for next run (update env var or external store) return { synced: records.length, cursor: newCursor }; }
Когда подходит и когда нет
Когда управляемые расписания лучше crontab
Когда это уместно
- Нужны полные cron-выражения, а не фиксированные интервалы
- Важны история прогонов и алерты на ошибки
Когда лучше выбрать другое
- Простая задача раз в час без требований к истории — хватит и crontab
Вопросы и ответы
Вопросы и ответы
Можно ли запускать ту же функцию по расписанию и по HTTP?
Да. Укажите тот же function ID в cron-триггере пайплайна и в HTTP-маршруте шлюза. При необходимости различайте контекст вызова через event.pipeline в обработчике.
В каком часовом поясе интерпретируются cron-выражения?
Для продакшена используйте UTC, если нет жёсткого требования к «стенным» часам бизнеса. Зафиксируйте допущение о часовом поясе в названии пайплайна.
What is the minimum cron interval?
One minute. The scheduler polls every 30 seconds, so actual fire time can be up to 30 seconds after the scheduled minute. Never rely on intervals shorter than 1 minute or on second-level precision.