Cron в Go: фоновые и периодические задачи на robfig/cron
У каждого сервиса рано или поздно появляется работа «по расписанию»: ночной отчёт, чистка сессий, напоминания, синхронизация с внешним API. В Go за это отвечает robfig/cron — де-факто стандартный планировщик с синтаксисом классического cron: пять полей, секунды по желанию, часовые пояса из коробки.
Курс ведёт от первого тика до боевого планировщика: выражения и спецсимволы, задачи-функции и задачи-структуры, Start и Stop, контекст и отмена, перекрытие запусков и wrappers Recover, DelayIfStillRunning, SkipIfStillRunning. Отдельные уроки — про то, чего в учебниках нет: конкурентность задач, утечки горутин, логирование и метрики, корректный shutdown и блокировки при нескольких инстансах.
Планировщик и его задачи — обычный Go-код, значительная часть которого runnable в браузерной песочнице: эмуляция времени, состояния и очередей задач выполняется на интерпретаторе клиента, а связка с системным cron — локально.
Чему научитесь
Чему научитесь
- Собирать планировщик на robfig/cron v3 и запускать задачи по расписанию
- Читать и писать cron-выражения: пять полей, спецсимволы, @daily
- Управлять жизненным циклом: Start, Stop, Entry, Remove
- Держать часовые пояса и секундные расписания под контролем
- Оберегать задачи: Recover, DelayIfStillRunning, SkipIfStillRunning
- Останавливать планировщик без обрыва задач и без утечек горутин
- Наблюдать за задачами: логи, метрики, распределённые блокировки
Для кого курс
- Бэкенд-разработчикам, которым нужны задачи по расписанию в сервисе
- Тем, кто до сих пор зовёт функции из внешнего crontab
- Разработчикам ботов, отчётов и интеграций с периодическими работами
Что понадобится
- Базовый синтаксис Go: функции, горутины, контекст (курс «Go с нуля»)
- Знакомство с time.Duration и горутинами из курса по продвинутому Go
Программа курса: 25 уроков
- 1Знакомство с cron: фоновые задачи в GoЧто такое задача по расписанию и где живёт планировщик.~16 мин · golang cron, фоновые задачи go
- 2Установка robfig/cron и первый планировщикgo get, cron.New, AddFunc, Start: первый тик.~18 мин · robfig cron, установка cron golang
- 3Синтаксис cron-выражений: пять полейМинуты, часы, дни: читаем и пишем выражения.~20 мин · синтаксис cron, cron выражение
- 4Спецсимволы: звёздочка, слэш, диапазоны и @daily*/5, 1-10, запятые и дескрипторы @hourly и @daily.~18 мин · спецсимволы cron, @daily cron
- 5AddFunc: задачи на функцияхЗамыкания, параметры, что нельзя делать в AddFunc.~18 мин · cron addfunc, cron задача go
- 6AddJob: задачи-структуры и интерфейс JobМетод Run, зависимости через поля, тестирование задач.~18 мин · cron addjob, интерфейс job go
- 7Часовые пояса: Timezone и локальное времяcron.New с Location, задачи в другом городе, DST.~16 мин · cron timezone, часовой пояс cron
- 8Секунды: cron.NewWithSecondsШестипольный формат, когда секунды нужны и опасны.~16 мин · cron с секундами, newwithseconds
- 9Start, Stop и жизненный цикл планировщикаStart асинхронен, Stop ждёт задач, Entry.ID.~18 мин · cron start stop, остановка cron go
- 10Контекст в задачах: отмена и дедлайныПередаём контекст, отменяем долгие операции.~18 мин · cron context, отмена задачи go
- 11Долгие задачи: перекрытие запусковЧто происходит, если задача не уложилась в интервал.~18 мин · cron перекрытие задач, long running job go
- 12Горутины и конкурентность задачКаждый тик — горутина: гонки, мьютексы, очереди.~20 мин · cron конкурентность, горутины cron
- 13Инспекция расписания: Entries и RemoveEntry.ID, список задач, удаление на лету.~16 мин · cron entry, удаление задачи cron
- 14Хранение расписания: конфиг и базаВыражения из YAML и таблицы задач.~18 мин · cron из базы, динамическое расписание go
- 15Динамическое расписание: добавление на летуДобавление и замена задач без рестарта сервиса.~18 мин · cron динамический, изменение расписания go
- 16Wrappers: Recover, DelayIfStillRunning, SkipЦепочки обёрток, паники и повторные входы.~20 мин · cron wrappers, delayifstillrunning
- 17Логирование задач: zap и slog рядомСтруктурные логи запусков, ошибок и длительности.~16 мин · логирование cron, логи задач go
- 18Метрики задач: длительность и ошибкиCounterVec по статусам, Histogram длительности.~18 мин · метрики cron, мониторинг задач go
- 19Graceful shutdown планировщикаСигналы, Stop с дедлайном, дожим задач.~18 мин · graceful shutdown cron, остановка задач go
- 20Утечки горутин в задачахЗабытые тикеры, зависшие воркеры, detect по метрике.~18 мин · утечка горутин, goroutine leak go
- 21Несколько инстансов: блокировки задачRedis-замки, лидерство, идемпотентность задач.~20 мин · распределенный cron, блокировки задач go
- 22Тестирование задач без ожиданияВызов Run напрямую, фейковое расписание, время под контролем.~18 мин · тестирование cron, тесты задач go
- 23Ошибки в задачах: ретраи и алертыЭкспоненциальные повторы, журнал ошибок, эскалация.~18 мин · повтор задачи go, retry cron
- 24cron против time.Ticker и NewTimerКогда хватает тикера, а когда нужен планировщик.~16 мин · time ticker go, cron vs ticker
- 25Итоговый проект: планировщик отчётовНочные отчёты, очистка, напоминания: полный сервис задач.~24 мин · cron проект go, планировщик задач go
Вопросы о курсе
Чем robfig/cron лучше системного crontab?
Системный cron запускает процесс целиком и не знает о вашем приложении. robfig/cron живёт внутри программы: задачи делят с сервисом конфиги, БД и graceful shutdown, а расписание можно менять на лету.
Почему cron v3, а не v1?
В v3 появились секунды по запросу, часовые пояса, цепочки wrappers и инспекция задач Entry. Курс учит версии v3 — она обратно несовместима с v1 в мелочах, и это стоит знать при чтении старых статей.
Код запускается в браузерной песочнице?
Большинство задач курса — обычные функции, и они runnable в браузере: интерпретатор эмулирует время и состояние. Уроки про сигналы и системное окружение выполняются локально, интерфейс урока всегда это помечает.