Yêu cầu: hiển thị ghế trống gần realtime, cho giữ ghế trong lúc thanh toán, và hai người không đặt trùng một ghế.
Thành phần chính:
- Seat map: mỗi ghế có trạng thái available / held / booked.
- Seat locking (giữ ghế tạm): khi user chọn ghế → tạo hold có TTL (vd 5–10 phút) qua Redis SET NX (khóa phân tán) hoặc SELECT ... FOR UPDATE. Hết TTL tự nhả.
- Xác nhận: thanh toán xong → chuyển held → booked trong một transaction; dùng optimistic locking (version) hoặc unique constraint (event_id, seat_id) để DB từ chối đặt trùng.
- Realtime: WebSocket / SSE báo cho các client khác biết ghế vừa bị giữ.
Đánh đổi / bottleneck: hàng nghìn người tranh vài ghế "đẹp" → hot row; TTL ngắn giảm ghế bị treo nhưng khó chịu cho user thanh toán chậm; tầng booking bắt buộc strong consistency (không eventual) nên giới hạn throughput → phải sharding theo event.