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.

20 minut · Automatizace

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

  1. Cron zvol, když je hlavním požadavkem kalendář nebo interval a celá úloha je krátká, měřitelná a restartovatelná.
  2. 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.
  3. Zachyť exit code, délku, poslední úspěch a chybu. Cron bez monitoringu pouze pravidelně spouští neviditelný problém.
  4. 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

  1. Frontu zvol, když práci vyvolá objednávka, webhook nebo jiná událost a nechceš blokovat webový request.
  2. Jedna zpráva má být rozumně malá a samostatně opakovatelná. Worker ji potvrzuje až po dokončení.
  3. Backlog absorbuje špičku a více workerů přidá kapacitu. Sleduj ale stáří nejstarší zprávy, ne jen počet.
  4. 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

  1. Scheduler ve stanovený čas pouze založí běh a publikuje malé zprávy pro konkrétní položky. Samotnou práci dělají workery.
  2. Běh identifikuj klíčem typu job + období. Unikátní constraint zabrání tomu, aby dvě instance rozeslaly stejnou dávku dvakrát.
  3. Položky publikuj po stránkách přes outbox nebo jiný spolehlivý mechanismus. Pád schedulera nesmí zanechat nejasnou polovinu dávky.
  4. 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.

  1. 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.

  2. Zastav workery a vytvoř backlog

    Po obnovení se fronta kontrolovaně vyprázdní bez duplicit a bez zahlcení závislostí.

  3. 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.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.