Orivel Orivel
Open menu

Design a Ticket Reservation System for Flash Concert Sales

Compare model answers for this System Design benchmark and review scores, judging comments, and related examples.

Login or register to use likes and favorites. Register

X f L

This page shows results from the earlier method (one-on-one matches between two models). Current results are in the snapshot rankings.

See current results →

Contents

Task Overview

Benchmark Genres

System Design

Task Creator Model

Answering Models

Judge Models

Task Prompt

You are the lead architect for a mid-sized ticketing company. Design the backend system that handles reserved-seat ticket sales for popular concerts. Tickets for these events often sell out within minutes of going on sale.

Your design must cover:

  1. A high-level architecture: the main components, how they talk to each other, and the data stores you would use.
  2. How seat holds and purchases work, including how you prevent the same seat being sold twice and how unpaid holds expire.
  3. How the system handles a traff...
Show more ▼

You are the lead architect for a mid-sized ticketing company. Design the backend system that handles reserved-seat ticket sales for popular concerts. Tickets for these events often sell out within minutes of going on sale.

Your design must cover:

  1. A high-level architecture: the main components, how they talk to each other, and the data stores you would use.
  2. How seat holds and purchases work, including how you prevent the same seat being sold twice and how unpaid holds expire.
  3. How the system handles a traffic spike when a sale opens, including any queueing or admission control and how it stays fair to users.
  4. How payment is integrated, including what happens if the payment provider is slow, times out, or returns an unclear result.
  5. Reliability: what happens when individual components fail, and how you meet the availability and durability targets.
  6. At least three important trade-offs you made, the alternatives you rejected, and why.
  7. The key metrics and alerts you would monitor during a big sale.

Present the answer as a structured plan with clear sections. Keep it under about 1200 words. Make any extra assumptions explicit.

Task Context

Constraints and requirements:

  • Peak load: up to 500,000 users arrive within the first 2 minutes of a major sale; a single event venue has up to 60,000 individually numbered seats.
  • Normal daily traffic is about 2,000 requests per second across all events.
  • A user may hold up to 6 seats at once; a hold lasts 8 minutes, and unpaid seats must then go back on sale.
  • No seat may ever be sold to two buyers. Overselling is a business-critical failure.
  • Payment is handled by an external payment provider whose API has...
Show more ▼

Constraints and requirements:

  • Peak load: up to 500,000 users arrive within the first 2 minutes of a major sale; a single event venue has up to 60,000 individually numbered seats.
  • Normal daily traffic is about 2,000 requests per second across all events.
  • A user may hold up to 6 seats at once; a hold lasts 8 minutes, and unpaid seats must then go back on sale.
  • No seat may ever be sold to two buyers. Overselling is a business-critical failure.
  • Payment is handled by an external payment provider whose API has a p99 latency of 3 seconds and sometimes times out.
  • Availability target for the purchase flow during sales: 99.95%. Confirmed orders must never be lost.
  • The team has 12 engineers and runs on a single major cloud provider, using two regions in the same country. Budget matters: the system should not be massively over-provisioned for 2,000 RPS normal load.
  • Users expect to see a seat map with near-real-time availability, but small delays in showing availability are acceptable.

Judging Policy

A strong answer gives a coherent architecture that clearly fits the stated constraints, rather than a generic list of technologies. It should explain a sound way to make seat allocation correct (for example, atomic conditional updates, transactional locking, or a single writer per event), with hold expiration that resists race conditions. It should also make clear that the seat map can be eventually consistent while the actual purchase decision must be strongly consistent. For the traffic spike, it should offer a r...

Show more ▼

A strong answer gives a coherent architecture that clearly fits the stated constraints, rather than a generic list of technologies. It should explain a sound way to make seat allocation correct (for example, atomic conditional updates, transactional locking, or a single writer per event), with hold expiration that resists race conditions. It should also make clear that the seat map can be eventually consistent while the actual purchase decision must be strongly consistent. For the traffic spike, it should offer a realistic admission-control or virtual waiting room approach, address fairness and protection against bots or retries, and use rough capacity estimates that match the numbers given. For payments, it should cover idempotency keys, timeouts, payments with an unknown outcome being reconciled later, and how holds relate to payment state. The reliability section should cover component failures, durable order storage, and a sensible multi-region strategy, while being honest about what is costly or complex given a 12-person team and budget limits. Trade-offs should name real alternatives and give specific reasons tied to the constraints. Monitoring should be specific to the sale (for example, hold conversion, queue depth, oversell checks, payment error rates). Penalize designs that allow double-selling, ignore the payment uncertainty, rely on vague phrases like 'just scale horizontally' without explaining how, or go well beyond the length limit with filler. Clarity, internal consistency, and explicit assumptions matter more than how many technologies are named.

Answers

Assumptions: Buyers are authenticated before checkout, the payment provider supports idempotency keys and authorization followed by capture, and the eight-minute hold is a deadline to complete a purchase—not a guarantee that a payment started at the last second will succeed. Safety takes precedence over availability during an ambiguous regional failure.

Architecture: Put a CDN and bot protection in front of a virtual waiting room, API gateway, and stateless seat-map, reservation, order, and payment services. Run services across multiple availability zones in the primary region, with a warm standby in the second...

Show Full Answer ▼

Assumptions: Buyers are authenticated before checkout, the payment provider supports idempotency keys and authorization followed by capture, and the eight-minute hold is a deadline to complete a purchase—not a guarantee that a payment started at the last second will succeed. Safety takes precedence over availability during an ambiguous regional failure.

Architecture: Put a CDN and bot protection in front of a virtual waiting room, API gateway, and stateless seat-map, reservation, order, and payment services. Run services across multiple availability zones in the primary region, with a warm standby in the second region; autoscale sale-facing services. Use one transactional database as the authority for seat state, holds, orders, and per-user limits. Replicate its committed state synchronously to the standby region. Publish database outbox events to a message bus for notifications and cache updates. Serve seat maps from a cache, with updates pushed to clients; displayed availability is advisory, not a promise. Keep the critical write path independent of the cache and message bus.

Holds and purchases: Give each event-seat pair one database row. A hold request locks the buyer’s per-event limit record and the requested seat rows in a consistent order, checks that the buyer will hold at most six seats, and atomically claims seats that are available or whose holds have expired. Store hold owner, token, and expiry using database time. Return conflicts without partial success unless the client explicitly accepts fewer seats. Neither cache entries nor a timer decide ownership: every competing hold and purchase checks the authoritative row in a transaction. A worker expires holds for prompt map updates, while reads and writes also treat expired holds as available, so a failed worker cannot strand seats.

At checkout, create a durable order attempt tied to the hold and an idempotency key. After payment authorization is definitively successful, atomically change the seats to SOLD and the order to CONFIRMED only if every seat still belongs to that hold and has not expired. Commit the confirmation and its outbox event together. Capture payment after confirmation; retry failed captures and reconcile them operationally. If confirmation loses the race to expiry, void or refund the authorization. A sold seat never becomes available again through hold expiry. Client retries use the same attempt key and retrieve the existing outcome rather than creating another purchase.

Opening-sale traffic and fairness: Admit users through the waiting room at a rate bounded by measured database and payment capacity, not by the number of web servers. Randomize positions among users present before the announced opening, then admit later arrivals in arrival order. Issue signed, short-lived admission tokens; enforce per-account purchase limits, bot challenges, and rate limits without letting repeated refreshes improve position. Show queue position estimates and shed nonessential traffic. Cache static seat-map geometry at the CDN and coalesce availability updates; cap concurrent holds and checkouts. Admission slows when lock contention, payment backlog, or error rates rise. A user admitted to browse gets no seat priority until a hold transaction commits.

Payment uncertainty: Never hold a database lock across a provider call. Use the provider’s idempotency key for retries and webhooks as evidence to reconcile timed-out or unclear authorizations; an HTTP timeout is not a decline. Query the provider before another attempt, and keep uncertain attempts visibly pending. Do not confirm an order without a definitive authorization and a successful seat transaction. If the eight-minute deadline passes first, the seats can be reclaimed; any later authorization is voided or refunded, not turned into a confirmed order. Alert on unresolved attempts and reconcile against provider settlement records. Disable new checkouts if reconciliation is unsafe rather than risk duplicate charges or sales.

Reliability and targets: Multi-zone instances, load balancers, and database failover handle ordinary node or zone failures. Stateless services can restart; a failed cache falls back to rate-limited authoritative reads; a failed bus delays maps and notifications but not purchases. Database transactions, durable logs, synchronous cross-region replication before acknowledging confirmations, backups, restore tests, and outbox replay protect confirmed orders. Keep the standby warm and test failover under sale load. Promotion requires fencing the old writer and verifying replicated progress: two regions alone cannot safely guarantee both immediate writes during a network partition and zero lost confirmations. Pause purchases if fencing or replication is uncertain. Measure 99.95% purchase-flow availability over a defined monthly window, excluding neither provider failures nor admission failures, and budget capacity and failover time against it; a sufficiently long regional partition may breach the target rather than permit overselling.

Trade-offs: Use a transactional seat database rather than Redis locks: higher write cost buys auditable, atomic ownership and orders. Use one writer with fenced failover rather than active-active seat writes: less geographic write availability, but no conflicting owners. Use cached, slightly stale maps rather than database reads for every viewer: conflicts can occur at selection, but a 500,000-user arrival does not overwhelm the authority. Use bounded admission rather than unlimited autoscaling: some users wait, but admitted checkouts remain usable and infrastructure need not be provisioned for the entire surge. Release expired holds despite uncertain payment rather than extending them indefinitely: inventory returns on time, at the cost of occasional voids or refunds.

Sale dashboard and alerts: Track queue depth, wait-time distribution and admission rate; API availability and latency; hold success, conflicts, expiry lag, per-user-limit failures and database lock waits; checkout conversion and order-confirmation latency; payment timeouts, pending-attempt age, authorization-to-confirmation mismatches, refunds and capture failures. Alert immediately on any duplicate-seat invariant violation or lost confirmed order; page on replication lag, failed fencing, low database capacity, rising 5xx rates, excessive payment uncertainty, and expiry backlog. Track cache staleness and outbox lag separately from authoritative purchase health.

Result

#1 | Winner

Winning Votes

3 / 3

Average Score

81

Total Score

88

Overall Comments

Answer A provides a clean, highly rigorous, and architecturally sound design that respects the budget and constraints of a 12-person team. It avoids unnecessary complexity (such as dual-layer Redis-plus-Postgres Lua locking which can lead to tricky split-brain or consistency issues) and places strong emphasis on transactional safety, payment uncertainty, and failure modes. The trade-offs are well justified and grounded in the prompt constraints.

View Score Details ▼

Architecture Quality

Weight 30%
90

Exceptional architecture that uses a single transactional database as the authority for seat state and orders, keeping the write path robust and avoiding split-brain risks while using a warm standby.

Completeness

Weight 20%
85

Thoroughly addresses all prompt requirements including high-level architecture, holds, expiration, traffic spikes, payment uncertainty, and operational alerts.

Trade-off Reasoning

Weight 20%
85

Presents concrete, realistic trade-offs (e.g., transactional seat DB vs Redis locks, one writer with fenced failover) tied directly to team size and budget limits.

Scalability & Reliability

Weight 20%
90

Demonstrates deep understanding of failure domains, replication safety, outbox patterns, synchronous cross-region replication for confirmations, and rigorous handling of unknown payment states.

Clarity

Weight 10%
90

Written with high density, strong technical vocabulary, and exceptional internal consistency without fluff or filler.

Total Score

75

Overall Comments

Answer A presents a tightly reasoned, internally consistent design: a single transactional authority for seat ownership, holds claimed in ordered row locks, expired holds treated as available by every reader and writer (so the reaper is an optimization, not a correctness dependency), confirmation conditional on the hold still being valid, and no DB lock held across the payment call. Payment uncertainty is handled properly (timeout is not a decline, query before retry, webhooks as evidence, void/refund if expiry wins, pause checkouts if reconciliation is unsafe). The reliability section is unusually honest about the two-region partition problem and fencing. Weaknesses: it gives no numeric capacity estimates (admission rate, DB write throughput, RPS budget), names few concrete technologies, and the prose is dense with few visual breaks, making it harder to skim.

View Score Details ▼

Architecture Quality

Weight 30%
80

Single transactional authority with ordered row locks, expired holds treated as available in every transaction, conditional confirmation tied to hold and idempotency key, outbox for side effects, and critical write path isolated from cache and bus. Correctness is clearly guaranteed and explained. Loses points for no capacity numbers and few concrete technology choices.

Completeness

Weight 20%
70

Covers all seven required sections plus explicit assumptions, including auth/capture, webhooks, fencing, bot protection, per-user limits, and sale-specific metrics. Missing rough capacity estimates matching the 500k/60k numbers, which the policy asked for.

Trade-off Reasoning

Weight 20%
78

Five trade-offs, each naming a real rejected alternative (Redis locks, active-active writes, live DB reads, unlimited autoscaling, indefinite hold extension) with reasons tied directly to overselling, budget, and the 500k surge. Compact but specific.

Scalability & Reliability

Weight 20%
75

Admission bounded by measured DB and payment capacity, backpressure from lock contention and payment backlog, synchronous cross-region replication before acknowledging confirmations, fenced failover, and honest acknowledgment that two regions cannot give both write availability and zero loss under partition. Lacks numeric sizing.

Clarity

Weight 10%
68

Well-sectioned, consistent terminology, explicit assumptions up front, and within length. Prose is dense and some sentences pack many ideas, which slows reading.

Total Score

79

Overall Comments

Answer A provides a coherent, safety-first design with transactional seat ownership, race-resistant expiration, explicit payment uncertainty handling, and durable order confirmation. Its admission control, failure isolation, and trade-offs fit the team's constraints well. The main omissions are quantitative capacity estimates and a clear policy for permanently failed payment captures after order confirmation.

View Score Details ▼

Architecture Quality

Weight 30%
82

A clearly separates advisory seat-map reads from authoritative transactions, locks seats and user-limit records consistently, and commits confirmations with an outbox. Its critical path avoids cache and bus dependencies. The synchronous cross-region database implementation remains somewhat abstract.

Completeness

Weight 20%
78

A addresses every requested area, including per-user hold limits, unknown payment outcomes, component failures, trade-offs, and sale-specific alerts. It lacks rough throughput or concurrency calculations tied to the stated traffic and provider latency, and leaves terminal capture failures to operational reconciliation.

Trade-off Reasoning

Weight 20%
80

A explains five concrete choices and their costs, including database transactions over Redis locks, fenced single-writer operation over active-active writes, and timely inventory release over indefinite payment holds. The alternatives are tied directly to correctness, budget, and user experience.

Scalability & Reliability

Weight 20%
76

A uses capacity-aware admission, stable queue placement, bot controls, multi-zone services, synchronous confirmation replication, and fenced regional promotion. It honestly prioritizes safety during partitions. Missing numerical sizing and failover/error-budget calculations prevent a stronger assessment of the availability target.

Clarity

Weight 10%
80

A uses readable labeled sections, explicit assumptions, and precise explanations of expiry and payment races. It stays within the requested approximate length and distinguishes availability guarantees from safety constraints without hiding the limitations.

  1. High-Level Architecture and Data Stores: The architecture leverages an active-passive multi-region setup (Primary Region A handles all transactional writes; Region B serves as hot standby for disaster recovery and regional read traffic). Edge / Virtual Waiting Room: A CDN layer (e.g., Cloudflare) fronts all traffic and integrates an edge virtual waiting room to absorb the initial 500k-user spike. API Gateway: Routes authenticated traffic, performs rate limiting, and validates signed queue admission tokens. Seat Availability Service (Read Path): Reads venue seat status from an in-memory cache (Redis) and serves...
Show Full Answer ▼
  1. High-Level Architecture and Data Stores: The architecture leverages an active-passive multi-region setup (Primary Region A handles all transactional writes; Region B serves as hot standby for disaster recovery and regional read traffic). Edge / Virtual Waiting Room: A CDN layer (e.g., Cloudflare) fronts all traffic and integrates an edge virtual waiting room to absorb the initial 500k-user spike. API Gateway: Routes authenticated traffic, performs rate limiting, and validates signed queue admission tokens. Seat Availability Service (Read Path): Reads venue seat status from an in-memory cache (Redis) and serves CDN-cacheable seat map snapshots (updated every 1-2 seconds via SSE or short-polling). Hold and Booking Engine (Write Path): Go/Java microservices executing seat reservation commands against an in-memory transactional cache layer (Redis Cluster) backed by a relational database. Order and Payment Service: Orchestrates order lifecycle, creates payment intents with the payment provider, listens for webhooks, and handles status reconciliation. Data Stores: (a) Redis Cluster: Sharded by Event ID, holds seat state bitmaps and hold leases (TTL: 8 minutes) for microsecond seat locking. (b) Relational Database (Amazon Aurora PostgreSQL Multi-AZ): The authoritative system of record for seats, holds, orders, tickets, and financial ledgers, using ACID transactions to guarantee zero overselling. (c) Kafka / SQS: Asynchronous message bus for order completion events, notifications, ticket PDF generation, and payment reconciliation. 2. Seat Holds, Concurrency, and Expiration: Zero overselling is guaranteed through a two-phase reservation model. In Phase 1 (In-Memory Hold), seat selection requests (up to 6 seats) hit the Hold Engine. A Redis Lua script atomically inspects the bitmask or hash state of the requested seats. If all seats are 'AVAILABLE', it marks them 'HELD', writes a Hold Record containing {user_id, hold_id, timestamp, seat_ids}, and sets a strict 480-second TTL. If any seat is already 'HELD' or 'SOLD', the Lua script aborts cleanly without partial allocation. In Phase 2 (Authoritative Database Hold), an idempotent DB record is created in Aurora within a single transaction: INSERT INTO holds (id, user_id, event_id, seat_ids, expires_at) VALUES (...) and updates seat status to 'HELD'. Expiration Handling: If the user does not finalize purchase within 8 minutes, the Redis hold expires via key expiration events (Redis Keyspace Notifications backed by a durable background reaper scanning Aurora for 'expires_at < NOW() AND status = HELD'). The reaper atomically flips seat status back to 'AVAILABLE' in Aurora and restores the Redis bitmask, instantly releasing seats back to active shoppers. Purchase Finalization: Upon payment confirmation, an ACID transaction in Aurora updates the seats to 'SOLD', marks the order 'PAID', generates immutable ticket records, and updates Redis seat status to 'SOLD'. 3. Traffic Spike, Admission Control, and Fairness: Handling 500,000 concurrent users within 2 minutes requires aggressive admission control so downstream services operate strictly within capacity. Edge Waiting Room: Users arriving before and during the sale opening are directed to a lightweight Edge Waiting Room. Users arriving before T-0 are placed in a pre-sale pool. At T-0, arrival order is randomized within the initial burst to eliminate millisecond bot advantages, after which strict FIFO queuing applies. Rate-Gated Admission: The system calculates admission throughput based on venue size and processing capacity (e.g., admitting 1,000 users every 10 seconds). Admitted users receive a cryptographically signed HMAC token containing {user_id, queue_slot, expires_at} valid for entry to the interactive seat map and checkout pipeline. Seat Map Optimization: Generating 60,000-seat maps dynamically for 500k users would crash databases. Instead, the seat map state is rendered as a compressed binary vector or delta-JSON chunk cached at the CDN edge with a 1-second TTL. Users fetch static venue geometry once, then pull 1-second cache-busted seat status deltas, keeping backend read load under 500 RPS. 4. Payment Integration and Failure Handling: Payments are orchestrated through an asynchronous state machine. Step 1 (Checkout Initiation): User enters payment flow; system creates an internal Order in 'PENDING_PAYMENT' state linked to the Hold ID. An idempotency key (order_id + attempt_count) is generated. Step 2 (External Provider Interaction): The frontend collects payment details using provider client-side SDKs (tokenized cards) and submits the charge intent. Because p99 latency is 3 seconds, API calls run asynchronously with client-side polling on order status rather than synchronous HTTP thread blocking. Timeout and Unclear Results: If the call times out or returns an ambiguous network error, the Order Service does not fail the order immediately. Instead, it places the order in 'PAYMENT_VERIFYING' and initiates a fallback worker that polls the provider's GET /charges/{idempotency_key} endpoint with exponential backoff (e.g., at 2s, 5s, 10s). Hold Extension Buffer: If an order enters 'PAYMENT_VERIFYING' within 60 seconds of the 8-minute hold expiration, the system grants an automatic 2-minute safety extension on the Redis hold to prevent releasing seats while a charge settles. Webhook Ingestion: Webhooks from the payment gateway are validated via HMAC signature and written directly to a durable queue before processing, ensuring idempotent state updates. Reconciliation Worker: An hourly reconciliation job compares payment gateway settlement reports against database records to catch any orphaned charges or unprocessed tickets. 5. Reliability, Failover, and Data Durability: Availability (99.95%) and Zero Data Loss: (a) Database Tier: Aurora PostgreSQL runs across 3 Availability Zones with automated synchronous storage replication and read replicas. If the primary writer fails, automated failover promotes a replica in under 30 seconds. (b) In-Memory Tier: Redis operates in a clustered master-replica topology across AZs. In the rare event of unrecoverable Redis crash, the seat state is rebuilt within 15 seconds by a warmup job executing a fast index scan over the Aurora seats table. (c) Regional Disaster Recovery: Cross-region Aurora storage replication maintains an RPO of under 1 second. Region B is configured in cold/warm standby. If Region A suffers a cloud-provider catastrophic outage, DNS failover redirects traffic to Region B, where services auto-scale and resume operations. (d) Idempotency: All APIs (hold, pay, release) enforce database-level unique constraints and Redis idempotency tokens to prevent duplicate side effects during retries. 6. Key Architecture Trade-Offs: (1) In-Memory Redis Lua Locking vs. Pure Database Row-Level Locking (SELECT FOR UPDATE). Rejected: Direct row-level locks in PostgreSQL for 500k concurrent requests cause massive lock contention, transaction queueing, and connection exhaustion. Chosen: Redis Lua atomic scripts for initial hold arbitration, persisting to Postgres asynchronously/sequentially. Trade-off: Slightly more complex dual-layer state synchronization in exchange for microsecond latency and zero database saturation. (2) Virtual Queue at Edge vs. Massive Auto-Scaling of Backend Services. Rejected: Dynamically scaling Kubernetes pods and databases to handle 500,000 raw RPS for an event with only 60,000 total seats is cost-prohibitive and limited by Aurora write throughput. Chosen: Edge queuing with controlled admission rate. Trade-off: Users wait in a queue, but system stability, operational costs, and user experience remain predictable and robust. (3) CDN-Cached Delta Polling vs. Full Duplex WebSockets for Live Seat Map. Rejected: Maintaining 500,000 persistent bidirectional WebSocket connections places severe stateful connection overhead on application servers. Chosen: Short-cached (1-second) CDN delta polling. Trade-off: 1-second latency in seat state visualization for users, which is entirely tolerable given the transactional Lua hold verification on click. 7. Key Operational Metrics and Alerts: Metrics: (a) Edge Queue Length and Inflow Rate. (b) Hold Creation Rate and Abandonment Rate. (c) Redis Memory Utilization, CPU, and Lua script execution latency (p95, p99). (d) Database Active Connections, Write Latency, and Replication Lag. (e) Payment Gateway Latency (p50, p99), Error Rate (5xx/timeouts), and Webhook Ingestion Delay. (f) Invariant Violation Counter: COUNT(DISTINCT order_id) WHERE seat_id = X AND status = 'SOLD' > 1 (strictly 0). Critical Alerts: (1) Invariant Breach: Any detection of oversold seat (P0, instant page). (2) Payment Timeout Spike: Payment timeout rate > 5% over 1 minute (P1). (3) Redis Memory / CPU: CPU > 75% or eviction count > 0 (P1). (4) Expired Hold Reaper Lag: Reaper queue delay > 30 seconds (P2).

Result

#2

Winning Votes

0 / 3

Average Score

60

Total Score

78

Overall Comments

Answer B is well-structured and covers all required prompt sections clearly. However, it introduces an overly complex dual-layer architecture (Redis Lua script checks backed by database transactions) which introduces synchronization challenges and potential edge cases around state divergence under high concurrency. It also glosses over the operational overhead of maintaining this dual-layer setup for a small 12-person engineering team.

View Score Details ▼

Architecture Quality

Weight 30%
75

Good overall structure, but introduces unnecessary complexity with a dual-layer state model (Redis Lua scripts for holding backed by Aurora) which increases synchronization overhead for a small team.

Completeness

Weight 20%
80

Covers all sections comprehensively with clear numbering and bullet points, matching the requested format well.

Trade-off Reasoning

Weight 20%
75

Provides clear trade-offs, though the justification for choosing Redis Lua over database locks leans heavily on performance assumptions without fully addressing the operational complexity added.

Scalability & Reliability

Weight 20%
80

Solid handling of multi-region and cache warming, though the recovery of Redis from Aurora under heavy load is glossed over briefly.

Clarity

Weight 10%
85

Clear, well-formatted, and easy to read with distinct numbered sections.

Total Score

62

Overall Comments

Answer B is concrete and practical, naming specific technologies, an admission rate, CDN delta-polling with a read-load estimate, a payment state machine with PAYMENT_VERIFYING and backoff polling, and alert thresholds. However it has several consistency gaps: seat arbitration happens in Redis while Aurora is called authoritative, with persistence described as asynchronous/sequential and no explicit conditional check at finalization, so the oversell guarantee rests on an under-specified dual-state sync; Redis rebuild from Aurora could drop not-yet-persisted holds; it claims zero data loss while stating a cross-region RPO under 1 second, which conflicts with 'confirmed orders must never be lost'; the 2-minute hold extension breaks the stated 8-minute rule without being flagged as an assumption; and the rejection of DB row locks cites 500k concurrent requests even though its own admission control limits the DB to roughly 100 users per second. Formatting is a single dense block, which hurts readability.

View Score Details ▼

Architecture Quality

Weight 30%
60

Coherent layered design with CDN waiting room, Redis Lua arbitration, Aurora as record, and a payment state machine. But the dual-state model is under-specified: Phase 2 DB write is not described as conditional, persistence is 'asynchronous/sequentially', Redis rebuild from Aurora could lose unpersisted holds, and finalization does not explicitly recheck the hold. Oversell safety is asserted more than demonstrated.

Completeness

Weight 20%
68

Covers all seven sections with concrete numbers (admission 1,000 per 10s, read load under 500 RPS, 1s TTL, alert thresholds) and bot-randomization. However it does not state assumptions explicitly, does not justify the 2-minute hold extension against the 8-minute constraint, and barely addresses the 12-engineer team or normal-load cost beyond one trade-off.

Trade-off Reasoning

Weight 20%
63

Three trade-offs with named alternatives and reasons. The edge-queue-vs-autoscaling and delta-polling-vs-WebSockets trade-offs are sound. The first one rejects DB row locks because of 500k concurrent requests, but the design's own admission control caps DB load near 100 users/sec, undermining the stated justification and the added complexity it buys.

Scalability & Reliability

Weight 20%
58

Multi-AZ Aurora, Redis rebuild from DB, and edge admission are reasonable. But 'zero data loss' is claimed alongside a cross-region RPO under 1 second, conflicting with the never-lose-confirmed-orders requirement; regional failover via DNS plus autoscale of a cold/warm standby is vague; Redis keyspace notifications are unreliable, mitigated only by a reaper with 30s lag tolerance.

Clarity

Weight 10%
60

Numbered sections and labeled sub-steps aid navigation, and concrete examples help. However it is delivered as one unbroken block of text, and a few claims (zero loss vs RPO, hold extension vs 8-minute rule) create internal inconsistency that reduces clarity of intent.

Total Score

40

Overall Comments

Answer B covers the requested topics and offers useful waiting-room, payment reconciliation, and monitoring details. However, its Redis/database dual-write design does not establish safe ownership checks at purchase or expiration, and its Redis-only hold extension contradicts the eight-minute requirement. Asynchronous regional replication permits losing confirmed orders. Unsupported performance guarantees, inconsistent standby descriptions, and dense presentation further weaken the plan.

View Score Details ▼

Architecture Quality

Weight 30%
35

B identifies the main components but introduces competing Redis and database ownership state without a safe dual-write recovery protocol. Database updates lack explicit ownership and expiry predicates, and an Aurora transaction cannot atomically include Redis updates. The claimed zero-overselling guarantee is therefore not established.

Completeness

Weight 20%
50

B addresses all seven headings and includes webhook verification and reconciliation. However, allowing six seats per request does not enforce six seats per user, late successful payments after release lack an explicit refund path, and extending holds violates the deadline. Its durability approach also fails the no-lost-confirmations requirement.

Trade-off Reasoning

Weight 20%
40

B gives three explicit alternatives, with reasonable arguments for edge admission and cached availability. However, rejecting database locking assumes the entire arrival burst reaches the database despite admission control. It also conflates 500,000 arrivals with 500,000 RPS and understates the correctness cost of dual-layer ownership.

Scalability & Reliability

Weight 20%
34

B offers rate-gated admission and useful caching, but its sub-second regional RPO still allows confirmed-order loss and regional promotion lacks fencing. Redis-only extensions conflict with the database reaper. Claims of a 15-second rebuild and fewer than 500 backend read RPS are unsupported, particularly alongside cache-busted polling.

Clarity

Weight 10%
44

B has recognizable numbered sections but presents them as a dense continuous block and exceeds the approximate word limit. Describing the standby as both hot and cold/warm, and persistence as both transactional and asynchronous, makes important behavior difficult to interpret.

Comparison Summary

Final rank order is determined by judge-wise rank aggregation (average rank + Borda tie-break). Average score is shown for reference.

Judges: 3

Winning Votes

3 / 3

Average Score

81
View this answer

Winning Votes

0 / 3

Average Score

60
View this answer

Judging Results

Why This Side Won

Answer A wins because it explicitly establishes transactional seat ownership and checks hold identity and expiration before confirmation, while Answer B relies on atomicity claims without specifying the conditions needed to prevent stale payment callbacks or expiration workers from corrupting ownership. A also handles payment uncertainty and regional durability more consistently. These advantages dominate the heavily weighted architecture and scalability/reliability criteria, despite A's missing capacity calculations.

Why This Side Won

Answer A wins on the most heavily weighted criteria. Its seat-allocation correctness is airtight and race-resistant, its payment handling is complete and conservative, and its multi-region reliability reasoning is honest about partition and fencing limits, all tied to the stated constraints. Answer B is more concrete with numbers and technologies, but its dual-layer Redis/Aurora model leaves the oversell guarantee under-specified, it contradicts the zero-loss requirement with a sub-second RPO, it silently violates the 8-minute hold rule, and one of its three trade-offs rests on a premise its own admission control removes. A's stronger architecture, trade-off reasoning, and reliability outweigh B's advantage in concreteness.

Why This Side Won

Answer A wins because it presents a more realistic and maintainable architecture for a 12-person team, avoiding the dangerous dual-state complexity (Redis Lua + Aurora) seen in Answer B. Answer A handles payment uncertainty, database outbox publishing, failover fencing, and transaction ordering with exceptional precision and clarity.

X f L