Sistem Tasarımı Mülakatı: Uber'i Tasarla
"Uber'i Tasarla" en yaygın sistem tasarımı sorularından biridir çünkü coğrafi mekânsal indeksleme, gerçek zamanlı konum akışı, eşleştirme ve yüksek yazma verimine aynı anda dokunur. Mülakatı yapan kişi gerçek Uber mimarisini aramıyor — problemi nasıl sınırladığını, savunulabilir seçimler yaptığını ve ölçek hakkında sesli düşündüğünü görmek istiyor.
Bunu bilinçli bir sırayla ele alın: gereksinimleri netleştirin, ölçeği tahmin edin, temel varlıkları ve API'leri taslayın, veriyi ve eşleştirme yolunu tasarlayın, ardından darboğazları ve ödünleşimleri tartışın. Aşağıdaki rehber bu sırayı takip eder, böylece sadece cevabı değil, yapıyı da pratik yaparsınız.
1. Gereksinimleri netleştirin
Tasarımdan önce fonksiyonel olanı fonksiyonel olmayandan ayırın ve kapsamı sabitleyin. Yolcular bir yolculuk talep eder ve sürücünün gerçek zamanlı yaklaştığını görür; sürücüler çevrimiçi olur ve yakındaki talepleri alır; sistem onları eşleştirir ve yolculuğu tamamlanana kadar takip eder.
- Fonksiyonel: yolculuk talep etme, yakındaki bir sürücüyle eşleşme, yolculuğu canlı takip etme, ücret hesaplama, yolculuk geçmişi.
- Fonksiyonel olmayan: düşük gecikmeli eşleştirme (saniyeler), yüksek kullanılabilirlik, gerçek zamanlı konum güncellemeleri, bir sürücünün tam olarak bir yolcuya atanmasının tutarlılığı.
- Kapsam dışı (bunu söyleyin): ödeme işlemenin iç detayları, değerlendirmeler, talep artışı ML'i — bunlardan bahsedip sonra erteleyin.
2. Ölçeği tahmin edin
Kabaca yapılan hesaplar sonraki seçimleri haklı çıkarır. Her 4 saniyede bir konum sinyali gönderen günlük ~10 milyon aktif sürücü olduğunu varsayalım — bu, konum verisi için saniyede ~2,5 milyon yazma anlamına gelir; bu da yazma yoğunluklu bir iş yüküdür ve basit bir ilişkisel tabloyu sıcak yol olarak kullanmayı anında eler.
3. Temel bileşenler ve API'ler
Servisleri ve istek akışını taslayın. Eşleştirme yolunu kalıcı yolculuk deposundan bağımsız tutun, böylece her biri kendi özelliklerine göre ölçeklenebilir.
- Konum servisi: sürücü sinyallerini alır, mevcut konumları bellek içi coğrafi mekânsal bir indekste tutar.
- Eşleştirme servisi: bir yolculuk talebinde, yakındaki çevrimiçi sürücüleri sorgular ve birini atar.
- Yolculuk servisi: yolculuk yaşam döngüsünün (talep edildi → eşleştirildi → devam ediyor → tamamlandı) kalıcı kaydı.
- Bildirim/akış: sürücünün canlı konumunu yolcuya iletir (WebSocket/uzun yoklama).
4. Coğrafi mekânsal eşleştirme — problemin kalbi
Mülakatı yapan kişinin en çok duymak istediği budur. Ham enlem/boylamı saklamak ve taramak O(n)'dir; bir mekânsal indekse gerek vardır. Quadtree'leri veya geohashing'i açıklayın: haritayı hücrelere bölerek 'bu noktanın yakınındaki sürücüleri bul' işlemini tam bir tarama yerine birkaç hücrenin sorgulanması haline getirin.
Geohashing bir bölgeyi, ortak öneklerin mekânsal yakınlığı ifade ettiği kısa bir dizeye kodlar, bu da 'yakın'ı bir önek sorgusuna dönüştürür. Sürücülerin mevcut hücreleri, hızlı okuma ve sık güncellemeler için bellek içi bir depoda (örn. Redis) bulunur; hücre büyüklüğü, hassasiyet ile sorgu yayılımı arasında ayarlanabilir bir ödünleşimdir.
5. Ölçeklendirme ve darboğazlar
Baskı noktalarını ve bunları nasıl hafifleteceğinizi belirtin. Saniyede 2,5 milyon konum yazma akışı en baskın olanıdır.
- Konum indeksini coğrafi olarak parçalayın (shard) — bir şehrin sürücüleri ve yolcuları aynı parça tarafından işlenir, böylece eşleştirme yerel kalır.
- Yazma yükünü bellek içi bir depo ve asenkron kalıcı yazmalarla emin; her sinyalin kalıcı bir veritabanına girmesi gerekmez.
- Çift rezervasyonu önlemek için atomik bir atama (kilit veya koşullu güncelleme) ile bir sürücü-bir yolcu garantisi sağlayın.
- Ani yükselişleri ayırmak için konum alımı ile aşağı akış tüketicileri arasında bir mesaj kuyruğu (Kafka) kullanın.
6. Dile getirilmesi gereken ödünleşimler
Mülakat yapanın değer verdiği gerilimleri belirterek kapatın: güçlü ile nihai tutarlılık (sürücü ataması güçlü olmalı; konum gösterimi nihai olabilir), bellek içi hız ile dayanıklılık, ve hücre büyüklüğü hassasiyeti ile sorgu yayılımı. Bunları açıkça ifade etmek, geçer bir cevap ile güçlü bir cevap arasındaki farktır.
Gerçek zamanlı yardımla Uber sistem tasarımını pratik yapın
Natively'nin sistem tasarımı mülakat asistanı, canlı bir tur sırasında sizi yapılandırılmış tutabilir — ele alınacak sonraki boyutu önerir ve ödünleşimleri gerçek zamanlı olarak gösterir, hepsi kendi cihazınızda.
