ADR_00007: Eventy publikovány přes Kafka
Status: Proposed / Accepted
Date: 2025-12-29
Context
V e‑shopu používáme DDD a všechny změny stavu agregátů jsou publikovány jako domain eventy.
Pro asynchronní integraci mezi doménami a microservices potřebujeme spolehlivý a škálovatelný messaging systém.
Po analýze možností (RabbitMQ, SQS, NATS, Kafka) chceme zvolit Kafka, protože:
- podporuje high-throughput a low-latency messaging,
- garantuje ordering per topic/partition,
- umožňuje event replay pro read modely, migrace a nové domény,
- dobře se integruje s outbox pattern.
Decision
- Všechny domain eventy jsou publikovány do Kafka topiců.
- Každá core nebo supporting doména má definované topicy pro své eventy.
- Ostatní domény čtou eventy přes Kafka consumer, typicky z inbox/outbox patternu.
- Garantujeme at least once delivery a idempotentní zpracování v consumeru.
- Eventy mohou být zpracovávány asynchronně a slouží k naplnění read modelů nebo triggeru dalších procesů.
Povolený postup
- Agregát změní stav a vytvoří domain event.
- Event se uloží do outboxu.
- Outbox worker publikuje event do příslušného Kafka topicu.
- Ostatní domény čtou eventy z topicu a aktualizují své read modely nebo reagují jinak.
Zakázané praktiky
- Přímé zápisy do cizích databází
Considered Alternatives
-
RabbitMQ
- Výhody:
- Snadné nasazení a správa, bohatá funkcionalita pro routing zpráv.
- Nižší latence při menším počtu zpráv.
- Nevýhody:
- Horší horizontální škálovatelnost při velkém počtu brokerů/nodů.
- Event replay není nativně podporováno (vyžaduje vlastní řešení nebo persistent queue).
- Pro provoz v Kubernetes složitější koordinace clusteru a failoveru.
- Výhody:
-
Azure Service Bus
- Výhody:
- Plně managed služba, vysoká dostupnost a SLA.
- Podpora topic/subscription modelu a dead-letter queues.
- Nevýhody:
- Vyšší cena při velkém objemu zpráv.
- Latence a propustnost mohou být omezené ve srovnání s Kafkou pro high-throughput scénáře.
- Vendor lock-in a závislost na cloudové infrastruktuře.
- Výhody: