| Users | Booking Requests/Second | Conflict Rate | Database Load | Locking/Queueing | Latency |
|---|---|---|---|---|---|
| 100 users | ~10 | Low | Single DB instance handles well | Minimal locking | Low latency |
| 10,000 users | ~1,000 | Moderate | DB under moderate load, some locks | Lock contention visible | Latency increases slightly |
| 1,000,000 users | ~100,000 | High | Single DB overloaded | High lock contention, queueing delays | High latency, timeouts possible |
| 100,000,000 users | ~10,000,000 | Very high | DB cluster needed, sharding required | Distributed locking or conflict resolution needed | Latency critical, fallback needed |
Booking conflict resolution in LLD - Scalability & System Analysis
Start learning this pattern below
Jump into concepts and practice - no test required
The database is the first bottleneck because booking conflict resolution requires checking and updating availability atomically. As user requests grow, the DB faces high contention and locking delays, causing slow responses and possible failures.
- Optimistic Locking: Use version numbers or timestamps to detect conflicts and retry without heavy locks.
- Pessimistic Locking: Lock resources during booking to prevent conflicts but can reduce concurrency.
- Queueing Requests: Serialize booking requests per resource to avoid conflicts.
- Horizontal Scaling: Add more application servers behind load balancers to handle more requests.
- Database Sharding: Partition booking data by resource or region to reduce contention.
- Caching Availability: Use cache to reduce DB reads, but ensure cache consistency.
- Conflict Resolution Service: Use a dedicated service or distributed lock manager (e.g., Redis Redlock) to coordinate bookings.
- Eventual Consistency: For less critical bookings, allow temporary conflicts and resolve asynchronously.
- At 1,000 booking requests/sec, DB needs to handle ~1,000 QPS with atomic checks.
- Each booking record ~1 KB, 1M bookings/day -> ~1 GB storage/day.
- Network bandwidth depends on request size; assume 1 KB/request -> ~1 MB/s at 1,000 QPS.
- Locking and retries increase CPU usage on DB and app servers.
- Scaling DB horizontally and adding caching reduces cost per request.
Start by explaining the booking flow and where conflicts happen. Identify the database as the bottleneck due to atomicity needs. Discuss trade-offs between optimistic and pessimistic locking. Propose scaling by sharding and caching. Mention fallback strategies like queueing or eventual consistency. Keep answers structured: problem, bottleneck, solution, trade-offs.
Your database handles 1000 QPS for booking requests. Traffic grows 10x to 10,000 QPS. What do you do first and why?
Answer: The first step is to reduce database contention by implementing optimistic locking and adding read replicas for scaling reads. Also, consider sharding booking data to distribute load. This prevents the DB from becoming a bottleneck due to locking delays.
Practice
Solution
Step 1: Understand booking conflict concept
Booking conflict resolution ensures no two bookings overlap for the same resource.Step 2: Identify the goal of conflict resolution
The goal is to prevent double-booking by checking time overlaps and rejecting or adjusting conflicting bookings.Final Answer:
To prevent overlapping reservations for the same resource -> Option DQuick Check:
Conflict resolution = prevent overlaps [OK]
- Thinking multiple bookings at same time are allowed
- Assuming conflict resolution deletes bookings
- Ignoring time overlaps in bookings
(start1, end1) and (start2, end2) overlap?Solution
Step 1: Understand time interval overlap condition
Two intervals overlap if one starts before the other ends and vice versa.Step 2: Match condition to code
Conditionstart1 < end2 and start2 < end1correctly detects overlap.Final Answer:
if start1 < end2 and start2 < end1: overlap -> Option AQuick Check:
Overlap check = start1 < end2 and start2 < end1 [OK]
- Using <= instead of < causing false negatives
- Confusing no overlap with overlap conditions
- Checking equality as overlap incorrectly
[(10, 12), (14, 16), (18, 20)], what will be the result of checking a new booking (12, 14) for conflict using the overlap condition start1 < end2 and start2 < end1?Solution
Step 1: Check overlap with each existing booking
Check (12,14) against (10,12): 12 < 12 is false, no overlap. Against (14,16): 12 < 16 true, 14 < 14 false, no overlap. Against (18,20): no overlap.Step 2: Determine conflict result
No overlaps found with any existing booking intervals.Final Answer:
No conflict -> Option CQuick Check:
New booking fits between existing without overlap [OK]
- Assuming touching intervals overlap
- Ignoring strict less than condition
- Confusing start and end times
def is_conflict(new_start, new_end, existing_bookings):
for start, end in existing_bookings:
if new_start <= end and new_end >= start:
return True
return FalseSolution
Step 1: Analyze the overlap condition
Conditionnew_start <= end and new_end >= startincludes cases where bookings just touch at edges, causing false conflicts.Step 2: Correct condition for strict overlap
Usenew_start < end and new_end > startto detect true overlaps only.Final Answer:
The condition incorrectly uses <= and >= causing false conflicts -> Option AQuick Check:
Use strict inequalities for overlap [OK]
- Using inclusive operators causing false positives
- Forgetting to return a boolean
- Not iterating over all bookings
Solution
Step 1: Understand scalability and conflict resolution needs
Centralized locking (Use a centralized lock on the entire booking database for each new booking) causes bottlenecks; manual or no checks (Options C, D) cause errors.Step 2: Choose efficient conflict detection method
Querying only relevant time slots reduces load; optimistic concurrency control handles race conditions efficiently.Final Answer:
Check for conflicts by querying only relevant time slots and use optimistic concurrency control -> Option BQuick Check:
Efficient conflict check + concurrency control = scalable solution [OK]
- Using global locks causing slowdowns
- Ignoring concurrency issues
- Not filtering bookings by time before checking
