Design Uber

Learn to design a system similar to Uber.

Overview

Uber is an application that provides ride-hailing services to its users. Anyone who needs a ride can register and book a vehicle to travel from source to destination. Anyone with a vehicle can register as a driver and take riders to their destinations. Drivers and riders can communicate through the Uber app on their smartphones.


Let’s evaluate your understanding of the functional and nonfunctional requirements for Uber. Identify the functional and three nonfunctional requirements for Uber in the widget below. Provide the need for each requirement in a single line.

Identify the functional and nonfunctional requirements for Uber.

Requirements

Let’s start with the requirements for designing a system like Uber.

Functional requirements

The functional requirements of our system are as follows:

  • Update driver location: The driver is a moving entity, so the driver’s location should be automatically updated at regular intervals.

  • Find nearby drivers: The system should find and show the nearby available drivers to the rider.

  • Request a ride: A rider should be able to request a ride, after which the nearest driver should be notified about the rider’s requests.

  • Manage payments: At the start of the trip, the system must initiate the payment process and manage the payments.

  • Show driver estimated time of arrival (ETA): The rider should be able to see the ETA of the driver.

  • Confirm pickup: Drivers should be able to confirm that they have picked up the rider.

  • Show trip updates: Once a driver and a rider accept a ride, they should be able to constantly see trip updates, like ETA and current location, until the trip finishes.

  • End the trip: The driver marks the journey as complete upon reaching the destination, and they then become available for the next ride.

Point to Ponder

1.

What if two drivers are the same distance from the rider? How will we select the driver to whom we’ll send the request?

Show Answer
Q1 / Q1
Did you find this helpful?

Non-functional requirements

The non-functional requirements of our system are as follows:

  • Availability: The system should be highly available. The downtime of even a fraction of a second can result in a trip failure, in the driver being unable to locate the rider, or in the rider being unable to contact the driver.

  • Scalability: The system should be scalable to handle an ever-increasing number of drivers and riders.

  • Reliability: The system should provide fast and error-free services. Ride requests and location updates should happen smoothly.

  • Consistency: The system must be strongly consistent. The drivers and riders in an area should have a consistent view of the system.

  • Fraud detection: The system should be able to detect any fraudulent activity related to payments.

Building blocks we will use

The design of Uber utilizes the following building blocks:

Press + to interact
Building blocks used for designing Uber
Building blocks used for designing Uber
  • Databases store the metadata of riders, drivers, and trips.

  • A cache stores the most requested data for quick responses.

  • CDNs are used to effectively deliver content to end users, reducing delay and the burden on end-servers.

  • A load balancer distributes the read/write requests among the respective services.

Riders’ and drivers’ devices should have sufficient bandwidth and GPS equipment for smooth navigation with maps.

Detailed design of Uber

Let’s look at the detailed design of our Uber ...