Praktický návod
Cron nebo message queue: co použít pro automatizaci?
Cron rozhoduje kdy začít. Fronta rozhoduje, jak bezpečně rozdělit jednotlivé úlohy mezi workery.
Nejdřív stručně
Časový spouštěč a transport úloh nejsou soupeři
Cron nebo scheduler se hodí pro událost v čase: každý den uzavřít report, každých pět minut hledat expirované rezervace nebo jednou měsíčně vystavit doklady.
Message queue se hodí pro jednotlivou práci vzniklou událostí nebo pro rozdělení velké dávky. Uchová backlog, dovolí více workerů a každá zpráva má vlastní acknowledgement i retry.
Připrav si
Pět otázek před volbou
Technologii vyber podle spouštěče, objemu a požadovaného zotavení, ne podle toho, co už běží v projektu.
- Vzniká práce v konkrétní čas, nebo okamžitě po události?
- Je to jedna krátká operace, nebo tisíce nezávislých položek?
- Co se má stát po výpadku, překryvu dvou běhů nebo několika hodinách backlogu?
- Lze operaci opakovat idempotentně a jak poznáš, že už pro dané období proběhla?
- Potřebuješ škálovat workery, řídit retry po jednotlivých položkách a sledovat průběh?
Kroky 1 až 3
Vyber nejjednodušší spolehlivou kombinaci
Jedna krátká denní úloha nepotřebuje cluster front. Tisíc položek zase nepatří do jednoho hodinového procesu bez checkpointu.
1. Použij cron pro malý časový celek
- Cron zvol, když je hlavním požadavkem kalendář nebo interval a celá úloha je krátká, měřitelná a restartovatelná.
- Zabraň překryvu dvou běhů pomocí zámku nebo unikátního záznamu období. Pokud běží více instancí, urč jednoho schedulera nebo sdílený lock.
- Zachyť exit code, délku, poslední úspěch a chybu. Cron bez monitoringu pouze pravidelně spouští neviditelný problém.
- Rozhodni, zda má zmeškaný běh po odstávce doběhnout. Samotný systémový cron nemusí historické termíny automaticky doplnit.
0 2 * * * php bin/console app:daily-report Oficiální Symfony Scheduler dokumentace 2. Použij frontu pro jednotlivé úlohy
- Frontu zvol, když práci vyvolá objednávka, webhook nebo jiná událost a nechceš blokovat webový request.
- Jedna zpráva má být rozumně malá a samostatně opakovatelná. Worker ji potvrzuje až po dokončení.
- Backlog absorbuje špičku a více workerů přidá kapacitu. Sleduj ale stáří nejstarší zprávy, ne jen počet.
- Nastav omezený retry a DLQ. Fronta bez failure policy mění dočasnou chybu na nekonečnou smyčku nebo ztracenou zprávu.
event → queue → worker → ack Oficiální RabbitMQ work queue tutorial 3. Pro velkou pravidelnou práci oba přístupy spoj
- Scheduler ve stanovený čas pouze založí běh a publikuje malé zprávy pro konkrétní položky. Samotnou práci dělají workery.
- Běh identifikuj klíčem typu job + období. Unikátní constraint zabrání tomu, aby dvě instance rozeslaly stejnou dávku dvakrát.
- Položky publikuj po stránkách přes outbox nebo jiný spolehlivý mechanismus. Pád schedulera nesmí zanechat nejasnou polovinu dávky.
- Stav běhu odvozuj z uložených položek a metrik, ne z paměti jednoho procesu. Umožni bezpečné pokračování a cílené opakování chyb.
scheduler → create run 2026-08-11 → enqueue item IDs → workers Oficiální Symfony Lock dokumentace Krok 4
Otestuj čas, překryv i backlog
Automatizace musí zůstat správná při zpoždění, dvojím spuštění a restartu uprostřed.
-
Spusť scheduler dvakrát současně
Vznikne jediný běh pro stejné období a každá položka se naplánuje právě jednou z pohledu business identity.
-
Zastav workery a vytvoř backlog
Po obnovení se fronta kontrolovaně vyprázdní bez duplicit a bez zahlcení závislostí.
-
Ukonči scheduler uprostřed fan-outu
Nový proces naváže podle uloženého checkpointu nebo outboxu. Žádná položka nesmí zůstat navždy neznámá.
Když to zlobí
Nejčastější chyby
Cron běží na každé replice
Urči jednu scheduler instanci nebo použij sdílený lock a unikátní klíč období. Samotný lokální lock kontejnery nesjednotí.
Dlouhý cron skončí po hodině napůl
Rozděl seznam na malé idempotentní zprávy a průběh ulož. Scheduler má fan-out řídit, ne držet celou dávku v jednom procesu.
Fronta neví, kdy má úlohu vytvořit
Queue je transport, ne kalendář. Časovou událost vytvoř schedulerem a teprve potom publikuj zprávu.
Po odstávce chybí denní běh
Definuj catch-up pravidlo a ukládej poslední úspěšné období. Po startu dopočítej chybějící intervaly vědomě, ne náhodným opakováním.
Hotovo
Automatizace má správný spouštěč i způsob práce.
Cron nebo scheduler hlídá čas, fronta rozděluje a uchovává úlohy. Pro velkou pravidelnou dávku je spoj přes uložený běh, idempotentní klíče a monitoring.