ADR_00010: Core domény – choreografie jako integrační vzor
Status: Proposed / Accepted
Date: 2025-12-30
Context
V našem e-shopu používáme DDD s Core, Supporting, Generic doménami a Channely.
Domény spolu musí komunikovat:
- mezi sebou navzájem (machine-to-machine),
- s cílem udržet eventual consistency,
- bez centrálního orchestrátora, aby byla zachována nezávislost domén.
Cílem je mít decoupled, škálovatelnou a odolnou architekturu, kde každá doména reaguje na eventy a vydává vlastní eventy.
Decision
Pro core domény je zavedena choreografie jako hlavní integrační vzor:
- Každá doména vydává eventy při změně svého stavu.
- Ostatní domény poslouchají relevantní eventy a reagují podle své vlastní logiky.
- Žádný centrální orchestrátor neřídí procesy mezi doménami.
- Synchronní volání (REST/gRPC) jsou používány pouze pro kritické autoritativní dotazy (např. checkout).
Pravidla implementace:
- Eventy jsou publikovány přes outbox pattern a doručovány spolehlivě přes Kafka.
- Domény implementují inbox workery pro zpracování příchozích eventů.
- Zpracování eventů je idempotentní.
- Eventy mohou být zachyceny pro audit a monitoring.
- Event-driven komunikace je primární způsob integrace; synchronní volání jen výjimečně.
Consequences
Pozitiva
- Domény jsou nezávislé a snadno rozšiřitelné.
- Škálovatelnost: služby mohou být deployovány nezávisle.
- Podpora eventual consistency a CQRS stylu.
- Eliminace centrálního bodu selhání.
- Jasný audit a trace přes eventy.
Negativa / náklady
- Obtížnější sledování end-to-end procesů.
- Potřeba monitoringu a observability eventů.
- Nutnost retry, DLQ a idempotence.
- Možná složitější ladění chyb a debugging.
Rationale
| Rozhodnutí | Odůvodnění |
|---|---|
| Choreografie jako hlavní integrační vzor | Umožňuje loose coupling mezi core doménami a snadné škálování |
| Event-driven architektura | Podpora CQRS a eventual consistency |
| Inbox / Outbox pattern | Zajištění spolehlivého doručení a idempotence |
| Synchronní volání jen výjimečně | Kritické autoritativní dotazy zachovávají konzistenci, ostatní logika zůstává decoupled |
Considered Alternatives
- Orchestrace (centralizovaný orchestrátor)
- Centrální služba řídí tok procesů mezi doménami, posílá příkazy a čeká na odpovědi.
- Eventy jsou doplňkem pro audit nebo sledování stavu, nikoli primární integrační kanál.
- Výhody:
- Snazší sledování end-to-end procesů.
- Jednodušší zajištění pořadí kroků a transakční logiky napříč doménami.
- Nevýhody:
- Centrální bod selhání.
- Závislost domén na orchestrátoru → méně decoupled.
- Horší škálovatelnost, orchestrátor může být bottleneck při vysokém zatížení.