Spolehlivá integrace
Jak synchronizovat data mezi dvěma systémy
Cílem není posílat všechno všude. Nejdřív si jasně řekni, kdo je vlastníkem každého údaje.
Nejdřív stručně
Co je synchronizace dat?
Synchronizace znamená, že dva systémy pracují se stejnou důležitou informací. Třeba e-shop se stavem skladu z ERP. Přenos obvykle vede přes API.
Nesnaž se o dokonalou shodu v každé milisekundě. Urči zdroj pravdy, přenos událostí a způsob, jak bezpečně dorovnat zpožděná nebo chybějící data.
Připrav si
Co budeš potřebovat
Než začneš programovat, domluv pravidla na papíře.
- Seznam polí, která synchronizuješ, a systém, který je pro každé pole zdrojem pravdy.
- Přístup do API obou systémů, testovací data a bezpečně uložené přihlašovací údaje.
- Veřejnou HTTPS adresu, pokud chceš přijímat webhooky.
- Frontu zpráv nebo tabulku úloh. Umožní ti synchronizaci dokončit i po krátkém výpadku druhé strany.
Krok 1
Navrhni tok dřív než první požadavek
Začni jedním směrem a jedním typem dat. Obousměrná synchronizace bez pravidel rychle vytvoří konflikty.
1. Urči zdroj pravdy a společný klíč
- Pro každý údaj napiš vlastníka. Například cenu řídí ERP, popis produktu e-shop.
- Ulož si stabilní externí ID. Název nebo e-mail se může změnit a není spolehlivý klíč.
- Při konfliktu preferuj vlastníka. Nesnaž se automaticky slepovat dvě různé změny.
external_id = "erp-product-1842" RFC 9110: HTTP semantics 2. Použij události a doplňovací kontrolu
- Když to druhý systém umí, přijímej webhook při změně. Zpracuj ho rychle a další práci předej mimo HTTP odpověď.
- Přidej pravidelný polling jen jako pojistku. Třeba jednou za hodinu načti změny od posledního času synchronizace.
- Nikdy nepředpokládej, že webhook dorazí přesně jednou. Může přijít pozdě nebo dvakrát.
GET /products?updated_since=2026-08-10T09:00:00Z Symfony Messenger 3. Zpracuj změnu ve frontě
- Do fronty zpráv pošli ID záznamu a jeho verzi, ne celý objekt, který může zestárnout.
- Worker si načte aktuální data, ověří verzi a zapíše změnu do cílového systému.
- Zapiš výsledek, čas a ID události. Unikátní ID ti přidá idempotenci.
php bin/console messenger:consume async -vv Symfony Messenger: queued messages Krok 2
Ověř si synchronizaci
Testuj běžnou změnu i situace, které se v produkci opravdu dějí.
-
Změň jeden záznam u vlastníka
Zkontroluj, že se do cílového systému propíše správné pole a zůstane zachované externí ID.
-
Pošli stejnou událost dvakrát
Výsledek musí být stejný jako po prvním pokusu. Tím ověříš idempotenci.
-
Simuluj nedostupné API
Úloha se nesmí ztratit. Musí zůstat ve frontě nebo ve failed transportu s dohledatelnou chybou.
php bin/console messenger:failed:show
Když to zlobí
Nejčastější chyby
Data se přepisují tam a zpět
U každého pole chybí vlastník. Zastav obousměrné zápisy a stanov zdroj pravdy.
Webhook dorazí vícekrát
Ukládej ID události s unikátním omezením. Opakování pak neprovede změnu podruhé díky idempotenci.
Záznamy se liší po výpadku
Spusť doplňovací polling od poslední úspěšné synchronizace. Neodvozuj poslední čas z času na serveru druhé strany.
Dlouhý import zablokuje požadavek
Endpoint má práci jen přijmout a předat do fronty zpráv. Synchronní import si nech jen pro malé ruční akce.
Hotovo
Synchronizace má jasná pravidla.
API teď používáš s jasným vlastníkem dat, bezpečným opakováním a kontrolou po výpadku.