Планировщик и фоновые задачи
(Раздел: Операции и Управление)
1) Назначение
Планировщик и фоновые задачи обеспечивают внепользовательскую работу платформы: периодические расчеты, публикации артефактов, клиринг и реплеи очередей. Цели — детерминированность, устойчивость к сбоям и аудитопригодность.
2) Таксономия задач
Time-based: по расписанию (cron/календарь): клиринг, закрытие окон RTP, выгрузки, архивации.
Event-driven: триггеры из шины (PaymentsSettled, PriceListUpdated).
One-off/Ad-hoc: разовые джобы с TTL.
Long-running: бэкоф/саги, стриминговые компакшены.
Maintenance: ротации ключей, репэкидж, индексы, прогрев кэша.
3) Архитектура (референс)
Компоненты:1. Scheduler (control-plane): хранит расписания, CAL/cron, окна обслуживания, таймзоны, ограничители.
2. Dispatcher: план → очередь (per-priority/tenant/region), проставляет дедлайны, идемпотентные ключи.
3. Workers: статические/автоскейл под пулы задач; heartbeats, leases.
4. Queue/Bus: FIFO/приоретизация, DLQ, отложенные сообщения.
5. Locker/Coordination: распределенные блокировки (leases), лидер-элекция (Raft/ZK/Consul).
6. Vault/KMS: JIT-секреты, короткие TTL.
7. Observability: traces/metrics/logs, дашборды, алерты.
8. Audit/WORM: неизменяемые квитанции выполнения, Merkle-срезы.
Паттерны: outbox/CDC, idempotency, компенсации (саги), backpressure, circuit-breakers.
4) Расписания: cron и календари
Cron v3: секунда/минута/час/день/месяц/день-недели; поддержка «/5», диапазонов, списков.
Календари/исключения: бизнес-календарь, «окна тишины», праздники/DST.
Таймзоны: храните `tz` на задаче; запуск по локальному времени тенанта.
Мультирегион: копии расписаний per-region или «ведущий регион + фолловеры» с дрейном/перевыбором.
5) Очереди, приоритеты, SLA
Классы приоритета: P0 (критично), P1, P2, P3; отдельные пулы воркеров.
SLA/дедлайны: `must_start_by`, `must_finish_by`; пропуск — эскалация/ретрай.
Квоты и fairness: caps на задач/мин/тенант, токены на «бурсты», изоляция noisy-neighbors.
Отложенные задачи: «не раньше чем» (delay/visibility timeout).
6) Конкурентность и блокировки
Leases: аренда работы с авто-продлением (heartbeat); по тайм-ауту — переизъятие.
Mutex/семафоры: per-ресурс (например, «прайс-лист х пишет только один воркер»).
Шардирование: по `tenant/region/hash(key)`; sticky-routing для кэш и локальности данных.
Лидер-элекция: один лидер публикует «системные» джобы (например, «закрыть все RTP окна»), фолловеры — горячий standby.
7) Надежность: ретраи, идемпотентность, дедуп
Идемпотентный ключ: `(task_type, business_id, window)`; повторы → та же квитанция.
Ретраи: экспоненциальный бэк-офф + джиттер, лимит попыток, стратегия on-error (retry/cancel/compensate).
Poison-pill: быстрый перевод в DLQ после N сбоев, алерт владельцу.
Dedup: seen-cache (in-memory+KV) на TTL окна.
Exactly-once эффекты: подтверждение побочных эффектов через транзакционный журнал/квитанции.
8) Управление длительными и тяжелыми задачами
Chunking: разбивка на батчи, чекпоинты/продолжение.
Time-boxing: ограничение CPU/IO/сетевого egress; прерывание с сохранением прогресса.
Саги/компенсации: семантика «undo» для межсервисных шагов.
Concurrency-caps: лимиты одновременных задач на тип/тенант/регион.
9) Наблюдаемость и метрики
Traces: `trace_id`, шаги саги, внешние вызовы.
Metrics (SLI):- Lag до старта, очередь (длина, возраст p95).
- Success Rate, error-rate, retry-rate.
- Latency p50/p95, time-to-complete.
- Cost per 1k задач, egress/ingress.
- DLQ rate, poison-pill rate.
- P0 старт ≤ 60 с, P1 ≤ 5 мин; Success ≥ 99.5%; DLQ ≤ 0.1%; Freshness (опершина) ≤ 30 с p95.
10) Аудит и доказуемость
Квитанции: `receipt_hash` на старт/успех/ошибку, DSSE-подписи для критичных типов (платежи, прайс-листы, RTP).
WORM: хранение логов выполнения и манифестов задач.
Chain-of-custody: кто поставил/одобрил/изменил расписание; SoD-проверки.
11) Безопасность и доступы
RBAC/ABAC/ReBAC: кто создает/одобряет/запускает; SoD: «создать выплату» ≠ «утвердить».
JIT-секреты: воркер запрашивает токены с коротким TTL по скоупу задачи.
Изоляция: пулы воркеров per-tenant/region/сетка; sandbox-исполнение.
PII-гигиена: маскирование/токенизация, запрет логирования первички.
12) FinOps и стоимость
Бюджеты/кап-алерты на compute/storage/egress.
Автоскейл воркеров по очередям и SLO.
Классы хранения: горячее (7–30 дней) → OLAP (6–24 мес) → архив.
Cost-aware планирование: окно запуска в «дешевые часы», лимиты на egress.
13) Модель данных (упрощенно)
14) API контракты (управление/интеграция)
`POST /schedules` — создать расписание (cron/cal, tz, окна).
`POST /jobs` — поставить ad-hoc; вернуть `job_id`, `receipt_hash`.
`GET /jobs/{id}` — статус/лог/квитанции.
`POST /jobs/{id}/cancel` — отмена с компенсацией.
`GET /queues/stats` — длины, лаги, p95.
Вебхуки: `JobStarted`, `JobSucceeded`, `JobFailed`, `JobDroppedToDLQ`, `SLOViolated`.
15) Плейбуки (типовые сценарии)
Retry-storm: включить глобальный бэк-офф, поднять таймауты зависимостей, включить circuit-breaker, дробление батчей.
DLQ-лавина: остановить прием, приоритизировать разбор DLQ, буферизовать новые задачи.
Лидер упал: перевыбор, верификация «двойных публикаций» по идемпотентности, аудит.
Завис провайдера (PSP/KYC): маршрут на резерв, снизить частоту polling/вебхуков, перевести транзакции в карантин.
Утечка секретов воркера: отзыв ключей, ротация, поиск «аномальных» запусков за 30 дней, ревью прав.
16) Специфика iGaming/финтех
Платежи/выплаты: асинхронные джобы с квитанциями, карантин «серых» транзакций, реплей очередей с дедупом.
RTP окна/лимиты: закрытие по календарю, наблюдаемый vs теоретический RTP, авто-пауза промо при дрейфе.
Прайс-листы/FX/Tax: публикации по расписанию, версии артефактов, форс-инвалидация кэша.
Аффилиаты: сверка конверсий, дедуп вебхуков, акты/подписи, эскроу по спорам.
17) Метрики качества (пример набора)
Schedule Adherence: доля задач стартовавших в окне ≥ 99%.
Queue Lag p95: P0 ≤ 60 c, P1 ≤ 5 мин.
Success/Retry/DLQ Rate: ≥ 99.5% / ≤ 0.4% / ≤ 0.1%.
Idempotency Errors: ≤ 0.01%.
Cost/1k jobs и Egress/job — в пределах бюджета.
Audit Completeness: 100% критичных задач с квитанциями.
18) RACI
19) Чек-лист внедрения
- Выделить классы задач, приоритеты и SLA; определить календари и таймзоны.
- Развернуть Scheduler/Dispatcher/Queue/Workers с лидер-элекцией и шардированием.
- Ввести идемпотентность, ретраи, DLQ, компенсации (саги).
- Настроить RBAC/ABAC/ReBAC, SoD и JIT-секреты для воркеров.
- Включить traces/metrics/logs, дашборды и алерты; SLO и error-budget.
- Подписанные квитанции (DSSE) и WORM-журналы для критичных типов.
- Автоскейл и кап-алерты по стоимости (compute/storage/egress).
- Плейбуки: retry-storm, DLQ-лавина, отказ лидера, деградация провайдера.
- Тесты: GameDay по каждому плейбуку, инъекции задержек/ошибок.
- Регулярные ревью расписаний, завалов очередей и ROI автоматизации.
20) FAQ
Почему cron недостаточно?
Без очередей, идемпотентности, блокировок и аудита cron ломается на сбоях и часовых поясах.
Можно ли объединять time-based и event-driven?
Да: cron — страховка для catch-up; события — для реактивности.
Как добиться «ровно-однажды»?
Дедуп по ключу, транзакционный журнал эффектов, квитанции и идемпотентные побочные действия.
Что делать с «долгими» джобами?
Чанк, чекпоинты, time-boxing, возможность прервать и продолжить.
Как не «съесть» бюджет?
Автоскейл по очередям и SLO, дешевые часы для тяжелых джоб, жесткие капы egress/compute.
Резюме: Планировщик и фоновые задачи — это производственный конвейер платформы. Встроив расписания и очереди, идемпотентность, блокировки и наблюдаемость, добавив квитанции/аудит, изоляцию тенантов и FinOps-контроль, вы получите предсказуемые сроки выполнения, быстрый recovery и юридически выдержанные операции в любых регионах и нагрузках.