Uber Sistem Dizaynı
Uber Sistem Dizaynı
Problemin Təsviri:
Uber kimi ride-sharing (taksi çağırma) servisi dizayn etmək lazımdır. Sistem aşağıdakı əsas komponentləri dəstəkləməlidir:
- Sürücü və sərnişin matching (uyğunlaşdırma)
- Real-time lokasiya izləmə
- Dinamik qiymətləndirmə (surge pricing)
- Ödəniş prosesləri
Functional Requirements:
Əsas Funksiyalar:
-
İstifadəçi İdarəetməsi
- Sərnişin və sürücü qeydiyyatı
- İstifadəçi profili və authentication
- Sürücü verifikasiyası və sənədləri
-
Səyahət Matching
- Sərnişin səyahət sorğusu (pickup və destination)
- Yaxınlıqdakı mövcud sürücülərin tapılması
- Sürücü-sərnişin uyğunlaşdırması
- Çoxsaylı sürücüyə paralel sorğu
-
Real-time Lokasiya İzləmə
- Sürücünün cari lokasiyasının izlənməsi
- Sərnişinə real-time yeniləmələr
- ETA (Estimated Time of Arrival) hesablama
- Naviqasiya və marşrut göstərilməsi
-
Dinamik Qiymətləndirmə
- Tələb və təklif əsaslı qiymət hesablama
- Surge pricing mexanizmi
- Region və vaxt əsaslı qiymət dəyişikliyi
- Qiymət təxmini
-
Ödəniş Sistemi
- Ödəniş metodlarının idarəsi
- Avtomatik ödəniş prosesləri
- Sürücüyə payout
- Səyahət tarixçəsi və qəbzlər
Non-Functional Requirements
Performance:
- Matching latency < 500ms
- Lokasiya update latency < 1s
- 99.99% uptime availability
- Real-time location tracking
Scalability:
- Milyonlarla concurrent user
- Geniş coğrafi əhatə
- Şəhər və region səviyyəsində sharding
- Horizontal scaling qabiliyyəti
Capacity Estimation
Fərziyyələr:
- 50 milyon active user
- 10 milyon daily active user (DAU)
- 5 milyon active driver
- 2 milyon daily active driver
- Hər sərnişin gündə orta 2 səyahət
- Orta səyahət müddəti: 20 dəqiqə
- Sürücü lokasiya update: hər 5 saniyə
Storage:
- User data: 50M × 2KB = 100GB
- Driver data: 5M × 5KB = 25GB
- Trip history: 20M trip/gün × 2KB × 365 gün = ~15TB/il
- Location data (time-series): ~100TB/il
Bandwidth:
- Location updates: 2M driver × 12 update/dəqiqə = 24M update/dəqiqə = 400K update/saniyə
- Hər update ~500 bytes: 400K × 500B = 200MB/s
QPS (Queries Per Second):
- Trip requests: ~20,000 request/saniyə (peak)
- Location updates: ~400,000 update/saniyə
- Map/routing API: ~50,000 QPS
High-Level System Architecture
Əsas Komponentlərin Dizaynı
1. Authentication Service
Məsuliyyətlər:
- İstifadəçi authentication (JWT)
- Session management
- Role-based access (sərnişin vs sürücü)
- Device tracking
Database Schema (PostgreSQL):
users:
- user_id (PK, UUID)
- phone_number (UK)
- email
- name
- password_hash
- user_type (rider/driver/both)
- status (active/suspended)
- created_at
- updated_at
drivers:
- driver_id (PK, UUID, FK → users)
- license_number
- vehicle_type
- vehicle_model
- license_plate
- rating (decimal)
- total_trips
- status (available/busy/offline)
- created_at
riders:
- rider_id (PK, UUID, FK → users)
- rating (decimal)
- total_trips
- default_payment_method_id
- created_at
API Endpoints:
POST /api/v1/auth/register
POST /api/v1/auth/login
POST /api/v1/auth/logout
GET /api/v1/users/{user_id}
PUT /api/v1/users/{user_id}
2. Trip Service
Məsuliyyətlər:
- Səyahət sorğularının idarəsi
- Səyahət statusunun izlənməsi
- Səyahət tarixçəsi
- Səyahət detallarının saxlanması
Database Schema:
trips:
- trip_id (PK, UUID)
- rider_id (FK → riders)
- driver_id (FK → drivers)
- status (requesting/accepted/in_progress/completed/cancelled)
- pickup_lat
- pickup_lng
- dropoff_lat
- dropoff_lng
- pickup_address
- dropoff_address
- estimated_price
- final_price
- estimated_distance_km
- estimated_duration_min
- surge_multiplier
- requested_at
- accepted_at
- started_at
- completed_at
- cancelled_at
- cancelled_by
- rider_rating
- driver_rating
İndekslər:
trips(rider_id, requested_at DESC)trips(driver_id, requested_at DESC)trips(status, requested_at DESC)
API Endpoints:
POST /api/v1/trips/request
POST /api/v1/trips/{trip_id}/accept
POST /api/v1/trips/{trip_id}/start
POST /api/v1/trips/{trip_id}/complete
POST /api/v1/trips/{trip_id}/cancel
GET /api/v1/trips/{trip_id}
GET /api/v1/trips/history
POST /api/v1/trips/{trip_id}/rate
3. Matching Service
Məsuliyyətlər:
- Yaxın sürücülərin tapılması
- Optimal sürücü seçimi
- Çoxsaylı sürücüyə paralel sorğu
- Matching alqoritminin icrası
Matching Alqoritmi:
-
Geo-spatial Search:
- Redis Geo-Index istifadə edilir
GEORADIUSkomutu ilə radius əhatəsində sürücülər tapılır- İlkin radius: 5 km, genişləndirilə bilər
-
Sürücü Filtrasiyası:
- Status: available
- Vehicle type uyğunluğu
- Rating threshold (məs. > 4.0)
-
Ranking:
- Məsafə (ən yaxın)
- Rating (ən yüksək)
- ETA (ən qısa vaxt)
- Acceptance rate
-
Parallel Dispatch:
- Top 5 sürücüyə eyni vaxtda sorğu
- İlk qəbul edən sürücü match olur
- 30 saniyə timeout
- Timeout olarsa, radius genişləndirilir və yenidən cəhd
Redis Geo-Index:
GEOADD drivers:available {lng} {lat} {driver_id}
GEORADIUS drivers:available {lng} {lat} 5 km WITHDIST
Matching Flow:
4. Location Service
Məsuliyyətlər:
- Sürücü lokasiyalarının qəbulu
- Real-time lokasiya yayımı
- Lokasiya tarixçəsinin saxlanması
- Geo-index yeniləmələri
Location Tracking Flow:
-
Sürücü lokasiya göndərir:
- Hər 5 saniyədə bir GPS koordinatları
- WebSocket və ya HTTP POST
- Batch update (çoxsaylı nöqtə)
-
Location Service:
- Kafka-ya event yazır
- Redis geo-index yeniləyir
- WebSocket vasitəsilə sərnişinə broadcast edir
-
Storage:
- Redis: aktiv sürücülərin cari lokasiyası (TTL: 30s)
- Time-series DB: lokasiya tarixçəsi
- S3: arxiv data (30+ gün)
Kafka Event Schema:
{
"driver_id": "uuid",
"location": {
"lat": 40.7128,
"lng": -74.0060
},
"heading": 180,
"speed": 45,
"timestamp": "2025-10-30T17:53:00Z",
"status": "available"
}
WebSocket Protocol:
// Sürücü update göndərir
{
"type": "location_update",
"driver_id": "...",
"location": {...}
}
// Sərnişin real-time update alır
{
"type": "driver_location",
"trip_id": "...",
"location": {...},
"eta_minutes": 5
}
Location Worker:
- Kafka-dan event-ləri consume edir
- Time-series DB-yə yazır
- Aggregate metrics hesablayır
5. Pricing Service
Məsuliyyətlər:
- Əsas qiymət hesablama
- Surge pricing tətbiqi
- Region-specific qiymətləndirmə
- Discount və promo kodlar
Qiymət Hesablama Formulu:
base_price = base_fare + (distance_km × per_km_rate) + (duration_min × per_minute_rate)
surge_multiplier = calculate_surge(region, time)
final_price = base_price × surge_multiplier × (1 - discount_rate)
Surge Pricing Mexanizmi:
-
Supply/Demand Nisbəti:
surge_ratio = pending_requests / available_drivers -
Surge Multiplier:
- surge_ratio < 1.0: multiplier = 1.0x (normal)
- surge_ratio 1.0-2.0: multiplier = 1.5x
- surge_ratio 2.0-3.0: multiplier = 2.0x
- surge_ratio > 3.0: multiplier = 3.0x (max)
-
Region və Time Window:
- Şəhər geo-hash region-lara bölünür
- Hər region üçün 1 dəqiqəlik window
- Redis-də cache (30 saniyə TTL)
Surge Calculation Flow:
Cache Strategy:
Key: pricing:surge:{region_id}:{time_bucket}
Value: { multiplier: 1.5, updated_at: timestamp }
TTL: 30 seconds
API Endpoints:
POST /api/v1/pricing/estimate
Body: { pickup_location, dropoff_location }
Returns: { estimated_price, surge_multiplier, breakdown }
GET /api/v1/pricing/surge/{region_id}
Returns: { current_surge, active_drivers, pending_requests }
6. Payment Service
Məsuliyyətlər:
- Ödəniş metodlarının idarəsi
- Səyahət ödənişlərinin prosesi
- Sürücüyə payout
- Refund idarəetməsi
Database Schema:
payment_methods:
- payment_method_id (PK, UUID)
- user_id (FK → users)
- type (credit_card/debit_card/wallet)
- last_four
- token (encrypted)
- is_default
- status (active/expired)
- created_at
payments:
- payment_id (PK, UUID)
- trip_id (FK → trips)
- rider_id (FK → riders)
- driver_id (FK → drivers)
- amount
- currency
- status (pending/completed/failed/refunded)
- payment_method_id
- transaction_id
- company_commission
- driver_payout
- processing_fee
- created_at
- completed_at
Payment Flow:
Payout Strategy:
- Weekly batch payout
- Minimum threshold (məs. $50)
- Async processing
- Retry mechanism (exponential backoff)
Database Sharding Strategy
User Sharding:
- Shard key:
user_id - Consistent hashing
- 16 shard (başlanğıc)
Trip Sharding:
- Shard key:
rider_id - Time-based partitioning (hər ay)
- Hot data: son 30 gün SSD-də
- Cold data: 30+ gün HDD-də
Location Sharding:
- Geo-hash əsaslı sharding
- Region per shard
- Popular region-lar replicate olunur
Caching Strategy
Multi-Level Cache:
-
Client-side:
- User profile
- Saved locations
- Recent trips
-
Redis Cache:
- Active driver locations (TTL: 30s)
- Surge pricing (TTL: 30s)
- User sessions (TTL: 24h)
- Popular routes ETA (TTL: 5min)
-
CDN:
- Static assets
- Map tiles
Failure Handling
Matching Failures:
- Timeout: 30 saniyə
- Retry: radius genişləndir (5km → 10km → 15km)
- Fallback: waiting queue
Payment Failures:
- Retry: 3 dəfə (exponential backoff)
- Alternative payment method
- Manual review queue
Location Update Failures:
- Client-side buffering
- Batch retry
- Last known location fallback
Service Degradation:
- Circuit breaker pattern
- Fallback to cached data
- Disable non-critical features
Monitoring və Observability
Key Metrics:
- Matching success rate
- Average matching time
- ETA accuracy
- Surge pricing accuracy
- Payment success rate
- Location update latency
- Active drivers per region
- Completed trips per hour
Alerts:
- Matching time > 30s
- Payment failure rate > 5%
- Location service latency > 2s
- Available drivers < threshold
Security Considerations
- JWT token authentication
- HTTPS/TLS encryption
- Payment data PCI-DSS compliance
- Location data privacy
- Rate limiting (DoS protection)
- Driver background check
- Fraud detection system
Əlavə Təkmilləşdirmələr
Sistemə əlavə edilə biləcək feature-lər:
- Ride Pooling: Çoxsaylı sərnişin eyni istiqamətdə
- Scheduled Rides: Gələcək vaxt üçün səyahət bronlaşdırma
- Favorite Drivers: Sevimli sürücüləri yadda saxlama
- Route Optimization: Machine learning ilə optimal marşrut
- Driver Incentives: Bonus və promotion sistemi
- Multi-stop Trips: Bir neçə dayanacaq nöqtəsi
- Accessibility Features: Xüsusi ehtiyaclar üçün nəqliyyat
- Corporate Accounts: Şirkət hesabları və billing