Designing Uber
Disclaimer: All things below are collected from public sources or purely original. No Uber-confidential stuff here.
Requirements
- ride hailing service targeting the transportation markets around the world
 - realtime dispatch in massive scale
 - backend design
 
Architecture

Why micro services?
==Conway's law== says structures of software systems are copies of the organization structures.
| Monolithic ==Service== | Micro Services | |
|---|---|---|
| Productivity, when teams and codebases are small | ✅ High | ❌ Low | 
| ==Productivity, when teams and codebases are large== | ❌ Low | ✅ High (Conway's law) | 
| ==Requirements on Engineering Quality== | ❌ High (under-qualified devs break down the system easily) | ✅ Low (runtimes are segregated) | 
| Dependency Bump | ✅ Fast (centrally managed) | ❌ Slow | 
| Multi-tenancy support / Production-staging Segregation | ✅ Easy | ❌ Hard (each individual service has to either 1) build staging env connected to others in staging 2) Multi-tenancy support across the request contexts and data storage) | 
| Debuggability, assuming same modules, metrics, logs | ❌ Low | ✅ High (w/ distributed tracing) | 
| Latency | ✅ Low (local) | ❌ High (remote) | 
| DevOps Costs | ✅ Low (High on building tools) | ❌ High (capacity planning is hard) | 
Combining monolithic ==codebase== and micro services can bring benefits from both sides.
Dispatch Service
- consistent hashing sharded by geohash
 - data is transient, in memory, and thus there is no need to replicate. (CAP: AP over CP)
 - single-threaded or locked matching in a shard to prevent double dispatching
 
Payment Service
==The key is to have an async design==, because payment systems usually have a very long latency for ACID transactions across multiple systems.
- leverage event queues
 - payment gateway w/ Braintree, PayPal, Card.io, Alipay, etc.
 - logging intensively to track everything
 - APIs with idempotency, exponential backoff, and random jitter
 
UserProfile Service and Trip Service
- low latency with caching
 - UserProfile Service has the challenge to serve users in increasing types (driver, rider, restaurant owner, eater, etc) and user schemas in different regions and countries.
 
Push Notification Service
- Apple Push Notifications Service (not quite reliable)
 - Google Cloud Messaging Service GCM (it can detect the deliverability) or
 - SMS service is usually more reliable