A seat-booking saga across three independently deployed services. No shared database and no distributed transaction — correctness comes from a transactional outbox, idempotent consumers, and a Redis hold that exactly one booking can win.
Books the selected seat and follows the saga as it crosses three processes. Every event is written to an outbox in the same transaction as the state change, then relayed to Kafka — so a crash mid-flight loses nothing.
A declined card triggers compensation: the hold is released and the seat returns to the map.
Fires N booking requests for the same seat in the same instant.
Every one is accepted — the API is asynchronous, so all callers get
201 PENDING. Then exactly one wins the Redis hold and the rest get
SeatsRejected before payment is ever attempted.
Leave it unchecked and every client uses a declining card, so the seat is released and you can run the race again.