Message broker (RabbitMQ)
Pošta mezi službami – exchange pro každý kontrakt, fronta pro každý modul, potvrzení doručení.
Na této stránce
V jedné větě: RabbitMQ přebírá zprávy od odesílatelů a rozděluje je do front příjemců; zprávy ve frontě čekají, i když příjemce zrovna neběží.
Topologie v MiniShopu
flowchart LR
subgraph pub["Odesílatelé (outbox)"]
web1[Web / Ordering]
inv1[Inventory.Api]
end
subgraph rabbit["RabbitMQ"]
x1{{"ReserveStockV1<br/>exchange fanout"}}
x2{{"StockReservedV1<br/>exchange fanout"}}
x3{{"… exchange pro<br/>každý kontrakt"}}
q1[["fronta minishop.inventory"]]
q2[["fronta minishop.ordering"]]
q3[["fronta minishop.audit"]]
end
web1 --> x1
inv1 --> x2
x1 --> q1
x1 --> q3
x2 --> q2
x2 --> q3
x3 -.-> q3
q1 --> inv2[Inventory.Api – consumer]
q2 --> web2[Web – consumer]
q3 --> audit[Web – auditní log]
- Exchange = jméno kontraktu (
OrderPlacedV1,ReserveStockV1…), typ fanout – každá navázaná fronta dostane kopii. Kód: RabbitMqTopology. - Fronta = modul (
minishop.ordering,minishop.inventory) navázaná jen na kontrakty, které modul odebírá. Kód: RabbitMqModuleConsumer. - Auditní fronta
minishop.auditje navázaná na všechno a jen loguje – „odposlech“ (wire tap), v logu je vidět celý průběh ságy. Poslouchá ji jen Web. Kód: RabbitMqAuditConsumer.
Přirovnání: Exchange je třídírna podle druhu zásilky, fronta je poštovní přihrádka oddělení. Oddělení, které je zrovna na dovolené, najde po návratu všechno v přihrádce.
Spolehlivost
| Situace | Co se stane | Kód |
|---|---|---|
| Odeslání | Publisher čeká na potvrzení brokeru (publisher confirms); bez potvrzení zpráva zůstane v outboxu | RabbitMqIntegrationBus |
| Broker neběží | Zprávy čekají v outboxu, nepočítá se to jako pokus | OutboxProcessor |
| Restart brokeru | Exchange i fronty jsou durable, zprávy persistent | RabbitMqTopology |
| Handler selže | Zpráva se po 2 s vrátí do fronty (nack + requeue) | RabbitMqQueueConsumer |
| Nečitelná zpráva | Zahodí se (nack bez requeue) | tamtéž |
| Výpadek spojení | Consumer se každých 5 s zkusí připojit znovu | tamtéž |
Proč broker (a ne přímé HTTP volání)
- Časové oddělení – sklad nemusí běžet ve chvíli, kdy vznikne objednávka.
- Odesílatel nezná příjemce – nový odběratel = nová fronta, odesílatel se nemění.
- Vyrovnání špiček – zprávy se zpracují, jak to příjemce stíhá.
Proč RabbitMQ: zralý, rozšířený, s výbornou webovou správou a Docker image; pro výuku přehlednější než Kafka (log událostí) nebo cloudové služby (Azure Service Bus, AWS SQS) vázané na jednoho poskytovatele.
Známá omezení
- Chybí dead-letter fronta – zpráva, na které handler stále padá, se vrací do fronty bez limitu.
- Fanout na kontrakt je jednoduchý; větší systémy používají topic exchange s routovacími klíči.