Паттерн · Inquir Compute

Задачи по расписанию в 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 для scheduled jobs

Полные cron-выражения: 0 9 * * 1-5 работает. Выражение валидируется при сохранении — опечатка выявляется сразу. Лидер-выборы через advisory-lock в Postgres гарантируют: расписание срабатывает на одном узле, даже если воркеров несколько.

Планировщик опрашивает каждые 30 секунд (минимальный интервал — 5 минут), поэтому срабатывание укладывается в ~30 с от запланированного времени. История каждого прогона — в консоли рядом с HTTP-вызовами; ретраи, таймауты и логи единые для всех триггеров.

Что входит в managed scheduled jobs

Валидация cron

Синтаксис cron-выражения проверяется при сохранении: следующий запуск показывается до применения.

История прогонов

Каждый запуск — запись с временем, статусом и логами.

Ретраи

Политика ретраев на уровне пайплайна — для задач, которые иногда падают из-за временных ошибок.

Секреты

Те же переменные окружения, что у HTTP-функций — меняются без редеплоя.

Как настроить расписание

1

Написать функцию-обработчик

Обработчик события scheduled: логика, которую нужно запускать по расписанию.

2

Создать пайплайн с cron-триггером

В настройках пайплайна выбрать schedule, ввести cron-выражение — сохранить.

3

Проверить в консоли

После первого срабатывания — история с логами и статусом прогона.

Nightly sync job with watermark

Scheduled handler reads cursor from environment, fetches incremental updates, upserts idempotently, and returns new cursor for the next run.

jobs/nightly-sync.mjs
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.