Skip to content

ADR_00005: Synchronizace dat výhradně pomocí eventů

Status: Proposed / Accepted
Date: 2025-12-28


Context

Systém obsahuje více nezávislých domén:

  • Catalog
  • Pricing
  • Stock
  • Orders
  • Checkout
  • etc

Každá doména:

  • vlastní svá data,
  • má vlastní databázi,
  • má vlastní odpovědnost.

Přímá synchronizace dat (např. SQL replikace, přímé čtení cizích tabulek) vede k:

  • silné vazbě mezi doménami,
  • nekonzistenci,
  • neřízeným závislostem,
  • porušení DDD principů.

V případě potřeby validace nedotazovat data, ptát se druhé domény na výsledek. Synchronizace dat v tomto kontextu je myšlena pouze pro eventual consistency scénáře.


Decision

Veškerá synchronizace dat mezi doménami probíhá výhradně pomocí eventů.

Platí následující pravidla:

  • žádné sdílené databáze
  • žádné přímé čtení cizích tabulek
  • žádné synchronní dotazy na data jiné domény
  • pouze eventy
  • vlastní read-only modely

Povolený způsob komunikace

  1. Doména provede změnu stavu
  2. Zapíše event do outboxu
  3. Event je publikován
  4. Ostatní domény:
  5. event přijmou
  6. uloží do inboxu
  7. aktualizují vlastní read model

Výjimky

Povoleny jsou pouze:

  • dotazy na agregované read modely
  • synchronní dotazy bez přenosu vlastnictví dat
    • např. ověření stavu
    • validace před akcí

Nikdy:

  • zápis do cizí databáze
  • přímá závislost na schématu jiné domény

Consequences

Pozitiva

  • Striktní oddělení domén
  • Vysoká škálovatelnost
  • Možnost nezávislého vývoje
  • Eventual consistency
  • Vysoká odolnost systému

Negativa

  • Nutnost práce s eventual consistency
  • Složitější debug
  • Vyšší nároky na observabilitu

Rationale

Rozhodnutí Důvod
Event-based sync Decoupling domén
Vlastní databáze Autonomie domény
Read modely Výkon a izolace
Zákaz přímého přístupu Prevence tight coupling

Considered Alternatives

  • Dotazování se ondemand
    • I v případě, kdy stačí eventual consistency ze snapshotu zatížit systém voláním dalších služeb a čekáním na jejich odpověď
    • Výhody:
      • Menší db a event zátěž
      • Žádná potřeba mapování
    • Nevýhody:
      • Časová náročnost operací