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.

25 minut · API, webhook a fronta

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íč

  1. Pro každý údaj napiš vlastníka. Například cenu řídí ERP, popis produktu e-shop.
  2. Ulož si stabilní externí ID. Název nebo e-mail se může změnit a není spolehlivý klíč.
  3. 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

  1. 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ěď.
  2. Přidej pravidelný polling jen jako pojistku. Třeba jednou za hodinu načti změny od posledního času synchronizace.
  3. 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ě

  1. Do fronty zpráv pošli ID záznamu a jeho verzi, ne celý objekt, který může zestárnout.
  2. Worker si načte aktuální data, ověří verzi a zapíše změnu do cílového systému.
  3. 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í.

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

  2. Pošli stejnou událost dvakrát

    Výsledek musí být stejný jako po prvním pokusu. Tím ověříš idempotenci.

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

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.