Design Uber
Problem
Design ride-sharing platform connecting riders and drivers.
Requirements
- Match rider with nearby driver
- Real-time location tracking
- ETA calculation
- Pricing (surge pricing)
- Scale: 100M rides/day
Key Challenges
- Geospatial: Find nearby drivers (< 5km)
- Real-time: Location updates (every 5 seconds)
- Matching: Assign driver to rider
High-Level Design
Geospatial Indexing
Redis GEOADD:
# Store driver location
redis.geoadd("drivers", longitude, latitude, driver_id)
# Find nearby drivers (5km radius)
nearby = redis.georadius("drivers", user_lon, user_lat, 5, "km")
Alternative: QuadTree, Geohash, S2 (Google)
Matching Algorithm
- Rider requests ride
- Find nearby drivers (5km)
- Filter available drivers
- Rank by: distance, rating, acceptance rate
- Send request to closest driver
- If declined, try next driver
Surge Pricing
demand = active_riders / available_drivers
if demand > 1.5:
multiplier = min(demand, 3.0) # Cap at 3x
else:
multiplier = 1.0
price = base_price × multiplier
WebSockets
- Real-time location updates (driver → server)
- Ride status updates (server → rider/driver)
Next: Design WhatsApp.