ADR_00012: Event Versioning Strategy – forward-compatible evoluce
Status: Proposed / Accepted
Date: 2025-12-30
Context
Architektura systému je založena na event-driven komunikaci mezi doménami.
Eventy jsou dlouhodobě perzistované, distribuované a konzumované více nezávislými službami.
V takovém prostředí:
- nelze předpokládat synchronní nasazení všech konzumentů,
- eventy mají dlouhou životnost,
- změny struktury eventu mohou způsobit rozpad integrace,
- neexistuje centrální bod, kde by bylo možné vynutit okamžitý upgrade.
Bez jasné strategie verzování by: - docházelo k nekompatibilním změnám, - vznikaly by skryté závislosti, - integrace by byly křehké a obtížně udržitelné.
Decision
Eventy jsou považovány za veřejné kontrakty
Každý event:
- je součástí veřejného integračního rozhraní,
- má dlouhodobou životnost,
- nesmí být měněn nekompatibilním způsobem.
Event není interní implementační detail.
Povolen je pouze forward-compatible vývoj
Povoleny jsou pouze změny, které:
- přidávají nové nepovinné atributy,
- nemění význam existujících polí,
- nemění semantiku eventu.
Zakázáno je:
- mazání polí,
- změna významu existujícího pole,
- změna typu pole,
- změna významu eventu bez nové verze.
Verzování eventů
Každý event:
- má explicitní verzi (např.
v1,v2) - verze je součástí názvu nebo metadat
- nová verze = nový typ eventu
Příklad:
- OrderCreated.v1
- OrderCreated.v2
Staré verze mohou existovat paralelně, dokud existují konzumenti.
Zákaz „breaking changes“ bez migračního plánu
Jakákoliv nekompatibilní změna musí mít:
- jasně popsanou migrační strategii,
- dobu souběhu verzí,
- plán odstranění staré verze,
- zpětnou kompatibilitu po přechodné období.
Povinné testy kompatibility
Pro každý event platí:
- kontraktové testy mezi producentem a konzumentem,
- validace schématu (např. JSON Schema / Avro),
- testy zpětné kompatibility.
Event bez testů kompatibility nesmí být publikován.
Consequences
Pozitiva
- Stabilní integrační rozhraní
- Možnost nezávislého nasazování služeb
- Minimalizace regresí
- Předvídatelná evoluce systému
- Čitelnost a dlouhodobá udržitelnost eventů
Negativa
- Vyšší disciplína při návrhu eventů
- Nutnost správy verzí
- Více testů a validační logiky
- Delší životní cyklus starých verzí
Rationale
| Rozhodnutí | Důvod |
|---|---|
| Event jako kontrakt | Zajišťuje stabilitu integrace |
| Forward-only změny | Zabraňuje rozbití konzumentů |
| Explicitní verze | Umožňuje paralelní provoz |
| Zákaz breaking changes | Ochrana celého ekosystému |
| Povinné testy | Prevence regresí |
Considered Alternatives
-
Backward-compatible changes
- Stará verze eventu je stále platná, nové konzumenty mohou používat nová pole.
- Výhody:
- Starší služby nemusí být okamžitě upraveny.
- Podporuje postupnou migraci.
- Nevýhody:
- Staré pole stále musí být podporováno → vyšší komplexita.
- Může vést k duplicitní logice ve více verzích.
-
Full version replacement (breaking change)
- Starý event je nahrazen úplně novou verzí (v2), stará verze je ukončena.
- Výhody:
- Čistý a jednoznačný kontrakt pro nové konzumenty.
- Možnost úprav eventu bez omezení.
- Nevýhody:
- Nutnost koordinace mezi všemi konzumenty.
- Riziko výpadků, pokud staré služby nejsou připraveny.
-
Transitive changes
- Event se mutuje bez jakýchkoliv pravidel
- Výhody:
- Není třeba verzování
- Možnost úprav eventu bez omezení.
- Nevýhody:
- Neudržitelný kontrakt