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