Ticket System
Lock Types
- 座位鎖:防止座位重複預訂
- 支付鎖:確保支付過程的原子性
- 庫存鎖:控制總票數的準確性
System Flow
sequenceDiagram
participant Init as Initializer
participant User1 as User A
participant User2 as User B
participant API as Ticket API
participant Cache as Redis Cache
participant DB as Database
participant MQ as Message Queue
participant Sub as Event Subscriber
participant Health as Health Check
Note over Init,Health: System Initialization Phase
rect rgb(240, 248, 255)
Init->>DB: Load all seat inventory
DB-->>Init: Return seat data
Init->>Cache: MULTI
Init->>Cache: SET inventory_count total_seats
Init->>Cache: SADD available_seats "A1,A2,..."
Init->>Cache: EXEC
Init->>Sub: Initialize subscribers
Sub->>MQ: Subscribe to booking events
Sub->>MQ: Subscribe to payment events
Init->>Health: Start health checks
Health->>Cache: Verify cache status
Health->>DB: Verify DB connection
Health-->>Init: System ready
end
Note over User1,Sub: Booking Flow
User1->>API: Request to book ticket (seat A1)
activate API
Note over API,Cache: Inventory & Lock Check
API->>Cache: MULTI
API->>Cache: GET seat:A1:status
API->>Cache: SETNX lock_seat_A1 "uuid_a" EX 30
API->>Cache: EXEC
Cache-->>API: OK (Lock Acquired)
rect rgb(240, 248, 255)
Note over API,Sub: Lock Watchdog
API->>MQ: Publish lock event
MQ-->>Sub: Monitor lock
activate Sub
Sub->>Cache: Auto-renew lock if needed
deactivate Sub
end
API->>DB: BEGIN TRANSACTION
API->>DB: SELECT seat FOR UPDATE
DB-->>API: Seat available
API->>DB: UPDATE seat status = 'RESERVED'
API->>DB: COMMIT
API->>MQ: Publish booking event
MQ-->>Sub: Process booking
activate Sub
Sub->>User1: Send booking confirmation
deactivate Sub
API-->>User1: Booking successful
deactivate API
Note over User2,Sub: Concurrent Booking Attempt
User2->>API: Request to book seat A1
activate API
API->>Cache: SETNX lock_seat_A1
Cache-->>API: Failed (Lock exists)
API-->>User2: Seat temporarily unavailable
deactivate API
Note over User1,Sub: Payment Processing
User1->>API: Submit payment
activate API
API->>Cache: SETNX payment_lock_A1 "uuid_payment" EX 60
Cache-->>API: OK
API->>DB: BEGIN TRANSACTION
API->>DB: UPDATE booking status = 'PAID'
API->>DB: UPDATE seat status = 'SOLD'
API->>DB: COMMIT
API->>MQ: Publish payment success
MQ-->>Sub: Process payment
activate Sub
Sub->>User1: Send payment confirmation
deactivate Sub
Note over API,Cache: Status Update
API->>Cache: MULTI
API->>Cache: DEL lock_seat_A1
API->>Cache: DEL payment_lock_A1
API->>Cache: SREM available_seats "A1"
API->>Cache: DECRBY inventory_count 1
API->>Cache: SET seat:A1:status SOLD
API->>Cache: EXEC
Cache-->>API: OK
API-->>User1: Payment confirmed
deactivate API
Note over Init,Health: Background Health Check
rect rgb(240, 248, 255)
loop Every minute
Health->>Cache: Verify cache consistency
Health->>DB: Check inventory sync
alt Inconsistency detected
Health->>Init: Trigger partial sync
Init->>Cache: Update inconsistent data
end
end
end