Перейти к содержимому
12 / 15

Как спроектировать планировщик отложенных задач?

Планировщик — это упорядоченное по времени хранилище плюс воркеры, которые забирают «созревшие» задачи. Ключевая операция — выбрать задачи с run_at <= now и захватить их так, чтобы никто другой их не взял: в SQL это SELECT ... FOR UPDATE SKIP LOCKED с арендой на время выполнения, в Redis — сортированное множество по времени с атомарным переносом в список «в работе». Гарантия честно формулируется как как минимум один раз: узел может умереть после выполнения, но до отметки о завершении, поэтому задачи обязаны быть идемпотентными. Точность — вопрос цены: тик раз в секунду стоит постоянных запросов, поэтому обычно берут несколько секунд и договариваются об этом явно. Повторяющиеся задачи хранят не как список запусков, а как правило плюс следующее время.

Как спроектировать планировщик отложенных задач? | JScriptiser