Skip to main content

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

  1. Geospatial: Find nearby drivers (< 5km)
  2. Real-time: Location updates (every 5 seconds)
  3. 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

  1. Rider requests ride
  2. Find nearby drivers (5km)
  3. Filter available drivers
  4. Rank by: distance, rating, acceptance rate
  5. Send request to closest driver
  6. 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.