Bir URL kısaltma servisi (bit.ly benzeri) nasıl tasarlarsınız?
Cevap
Klasik bir başlangıç sistem tasarımı sorusudur. Önce gereksinimleri netleştirip kaba hesap yapın, sonra tasarıma geçin.
Gereksinimler
- Fonksiyonel: uzun URL'den kısa kod üret, kısa koda gelen isteği yönlendir; opsiyonel olarak özel alias, son kullanma tarihi, tıklama istatistiği.
- Fonksiyonel olmayan: yönlendirme çok hızlı (düşük gecikme), yüksek erişilebilirlik, kodlar tahmin edilmesi zor olmalı.
- Ölçek varsayımı: günde 10 milyon yeni URL, okuma/yazma oranı yaklaşık 100:1, yani saniyede yaklaşık 115 yazma ve 11.500 okuma.
Kısa kod üretimi
- Base62 (
a-z A-Z 0-9): 7 karakter ile 62^7, yaklaşık 3.5 trilyon kombinasyon. - Yöntem 1: benzersiz sayısal ID (DB sequence, Snowflake veya önceden ayrılmış ID aralıkları) üret ve base62'ye çevir. Çakışma olmaz; ardışık ID'ler tahmin edilebilir olduğundan karıştırma (ör. bijektif bir dönüşüm) eklenebilir.
- Yöntem 2: URL'nin hash'ini (ör. SHA-256) alıp ilk 7 karakteri kullanmak; çakışma kontrolü ve tekrar deneme gerekir.
ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
def base62(n: int) -> str:
s = []
while n:
n, r = divmod(n, 62)
s.append(ALPHABET[r])
return "".join(reversed(s)) or "0"Mimari
İstemci -> Load Balancer -> API servisleri (stateless)
|-> Redis cache (kod -> uzun URL)
|-> Veritabanı (urls: code PK, long_url, created_at, expires_at)
|-> Kafka -> analitik (tıklama olayları)- Okuma yolu:
GET /aB3xK9pönce Redis'e bakar, yoksa DB, sonra cache'ler. Popüler linklerde hit oranı çok yüksektir. - Basit key-value erişim olduğu için DynamoDB/Cassandra gibi bir NoSQL ya da
codeüzerinde primary key'li PostgreSQL uygundur. - Yönlendirme kodu: 301 tarayıcıda cache'lenir (sunucu yükü azalır ama istatistik kaybolur), 302 her seferinde sunucuya gelir. Analitik isteniyorsa 302.
- Tıklama sayımını senkron DB update ile değil, asenkron olay akışıyla yapın.
Ek konular
Rate limiting (spam), zararlı URL kontrolü, süresi dolan kayıtların temizlenmesi, çok bölgeli dağıtım.
İlgili Sistem Tasarımı soruları
- Mesaj kuyruğu (RabbitMQ, Kafka) ne zaman kullanılır?
- Monolith ile mikroservis mimarisi arasındaki fark nedir? Mikroservislere ne zaman geçilmeli?
- CAP teoremi nedir? Gerçek sistemlerde nasıl yorumlanır?
- Dikey ve yatay ölçekleme arasındaki fark nedir?
- Hangi cache stratejilerini biliyorsunuz?
- REST ile GraphQL arasındaki farklar nelerdir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.