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.

  1. Mesaj kuyruğu (RabbitMQ, Kafka) ne zaman kullanılır?ZorSistem TasarımıBackend
  2. Monolith ile mikroservis mimarisi arasındaki fark nedir? Mikroservislere ne zaman geçilmeli?ZorSistem TasarımıBackend
  3. CAP teoremi nedir? Gerçek sistemlerde nasıl yorumlanır?ZorSistem TasarımıBackend
  4. Dikey ve yatay ölçekleme arasındaki fark nedir?KolaySistem TasarımıFull Stack
  5. Hangi cache stratejilerini biliyorsunuz?OrtaSistem TasarımıFull Stack
  6. REST ile GraphQL arasındaki farklar nelerdir?OrtaSistem TasarımıFull Stack

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle