HoldTheSeat

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.

Spring Boot 4Kafka KRaft PostgresRedis Outbox patternDocker Compose

Seat map

live
STAGE
available held — payment in flight sold

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.

Demo controls

Releases every hold and returns all seats to available. Past bookings keep their history.