0/25

System Design: Milyon Kullanıcıya Ölçeklenmek

Bu harita "Kubernetes var, bütçe sınırsız, yine de çöküyor" videosunun devamı. Mimariyi tek bir şemadan ezberlemek yerine, yükün yolunu izleyip her katmanın hangi sorunu çözdüğünü gösteriyor.

Sıra bilerek şöyle: önce sorunu koy, sonra kapıda koru, okumayı hafiflet, yazmayı sıraya al, en sonda dayanıklı ve görünür kıl. Her adımda bir öncekinin yetmediği yer var.

Milyon kullanıcıya ölçeklenen mimari şeması: kullanıcı, CDN, Load Balancer ve rate limiting, durumsuz uygulama sunucuları; okuma yolunda Redis önbellek ve okuma replikası; yazma yolunda mesaj kuyruğu, worker'lar ve DB Primary; altta dayanıklılık ve izleme şeridi.
  • Temelİşe girmeden önce sağlam bilinmeli
  • İyi olurİlanlarda sık geçiyor, elini güçlendirir
  • Sonraİşe girdikten sonra, ihtiyaç doğunca

Bir konuya tıkla: ne bilmen gerektiği ve kaynaklar açılır.

  1. 01

    Neden çöküyor?

    Sunucuyu çoğaltmak yetmiyor: asıl darboğaz hep ortak olan yerde. Önce sorunu doğru koy.

  2. 02

    Kapıda koru

    Yükün veritabanına ulaşmadan önce kesilmesi, ona yetişmeye çalışmaktan ucuzdur.

  3. 03

    Okumayı hafiflet

    Trafiğin çoğu okuma. Aynı veriyi tekrar tekrar veritabanından çekmeyi bırak.

  4. 04

    Yazmayı sıraya al

    Ağır işi doğrudan veritabanına yazma; kuyruğa al, sindire sindire işle.

  5. 05

    Dayanıklı ve görünür kıl

    Bir şey kesinlikle bozulacak. Önemli olan, bozulduğunda hepsinin birden düşmemesi ve neyin bozulduğunu görebilmen.

Konu konu

Haritadaki her konunun açıklaması, bilmen gerekenler ve kaynaklar — tek listede.

  1. 01Neden çöküyor?

    • Ölçeklemenin iki yolu· Temel

      Dikey ölçekleme makineyi büyütür, yatay ölçekleme sayısını artırır. Uygulama sunucuları yatay ölçeklenir; veritabanı ise çoğu zaman ilk tıkanan yer.

      Bilmen gerekenler

      • Dikey: kolay ama tavanı var
      • Yatay: sınırsıza yakın ama durumu (state) paylaşmak zorunda
      • Uygulama sunucusunu durumsuz (stateless) tut

      Kaynaklar

      • Durumsuz uygulama sunucusu· Temel

        Oturum ve dosya gibi durumu sunucunun belleğinden çıkarıp dışarı al; böylece her sunucu birbirinin yerine geçebilir.

        Bilmen gerekenler

        • Oturumu Redis'te ya da imzalı token'da tut
        • Dosyayı yerel diske değil nesne depolamaya yaz
      • Tek hata noktası· İyi olur

        Her sunucunun gittiği tek bir veritabanı, ağın ortasında tek bir bileşen: biri düşünce hepsi düşer.

        Bilmen gerekenler

        • Mimarideki her tek kutuya 'düşerse ne olur?' diye sor
    • Veritabanı neden tıkanır?· Temel

      Bağlantı sayısı, disk ve kilitler sınırlı. Yirmi sunucu aynı anda binlerce yazma gönderince bağlantı limiti dolar ve istekler birbirini bekler.

      Bilmen gerekenler

      • Bağlantı havuzu (pool) ve bağlantı limiti
      • Kilit çekişmesi ve yavaş sorgular
      • Tıkanma anında latency bir anda katlanır

      Kaynaklar

      • Bağlantı havuzu· İyi olur

        Her istek için yeni bağlantı açmak yerine sınırlı sayıda bağlantıyı paylaşmak; veritabanını bağlantı fırtınasından korur.

        Bilmen gerekenler

        • PgBouncer gibi bir havuz yöneticisi
        • Sunucu sayısı × havuz boyutu = veritabanına gelen bağlantı
  2. 02Kapıda koru

    • Load Balancer· Temel

      Gelen trafiği sağlıklı sunucular arasında dağıtır, düşen sunucuyu devreden çıkarır. Tek bir giriş noktası olmasa yatay ölçeklemenin anlamı kalmaz.

      Bilmen gerekenler

      • Round-robin, en az bağlantı gibi algoritmalar
      • Sağlık kontrolü (health check)
      • L4 ve L7 farkı

      Kaynaklar

      • Sağlık kontrolü· İyi olur

        Yük dengeleyici sağlıksız sunucuya trafik göndermesin diye uygulamanın kendini raporlaması.

        Bilmen gerekenler

        • Hafif bir /health ucu, veritabanı bağımlılığını ayır
    • Rate limiting· Temel

      Bir istemcinin ya da herkesin saniyede yapabileceği istek sayısını sınırlar; aşırı yük içeri girmeden reddedilir, sistem ayakta kalır.

      Bilmen gerekenler

      • Token bucket ve sabit pencere
      • 429 Too Many Requests + Retry-After
      • Kimlik başına ve IP başına sınır

      Kaynaklar

      • Sanal bekleme odası· Sonra

        Bilet satışı gibi ani patlamalarda kullanıcıları sıraya alıp sistemi boğmadan içeri sırayla alma.

        Bilmen gerekenler

        • Reddetmek yerine sıraya almak
    • CDN ve statik içerik· İyi olur

      Görsel, script ve değişmeyen sayfalar kullanıcıya yakın uçlardan sunulur; kaynak sunucuya hiç uğramaz.

      Bilmen gerekenler

      • Cache-Control başlıkları
      • Dinamik sayfayı kısa süreli önbelleğe alma

      Kaynaklar

  3. 03Okumayı hafiflet

    • Önbellek (Redis)· Temel

      Sık okunan veriyi bellekte tutan hızlı bir katman. Veritabanına giden okumanın büyük kısmını keser; ama yanlış kurulursa kendi sorununu yaratır.

      Bilmen gerekenler

      • Cache-aside deseni
      • TTL (geçerlilik süresi) ve geçersiz kılma
      • Önbellek de düşebilir: veritabanı bunu kaldırır mı?

      Kaynaklar

      • Cache-aside deseni· Temel

        Önce önbelleğe bak; yoksa veritabanından oku, önbelleğe yaz, öyle dön. En yaygın ve en basit desen.

        Bilmen gerekenler

        • Okuma yolunda iki adım, yazmada geçersiz kıl
      • Önbelleği geçersiz kılma· İyi olur

        Veri değişince eski kopyayı ne zaman ve nasıl atacağın: bilgisayar biliminin zor sorularından biri.

        Bilmen gerekenler

        • TTL'e güven, kritik veride yazmada sil
    • Cache stampede (izdiham)· Temel

      Popüler bir anahtarın süresi dolduğu anda yüz binlerce istek önbelleği ıskalayıp aynı anda veritabanına iner. Videonun asıl uyarısı bu.

      Bilmen gerekenler

      • TTL'e rastgele sapma (jitter) ekle
      • Tek uçuş (single-flight): yalnız biri yenilesin
      • Süresi dolmuş veriyi yenilenirken sunmak (stale-while-revalidate)

      Kaynaklar

      • TTL jitter· İyi olur

        Aynı anda yazılan anahtarlar aynı anda sona ermesin diye süreye küçük rastgele bir fark eklemek.

        Bilmen gerekenler

        • 3600 sn yerine 3600 ± %10
      • Tek uçuş / kilit· İyi olur

        Aynı anahtar için yalnızca bir istek veritabanına gider; diğerleri sonucu bekler ya da eski veriyi alır.

        Bilmen gerekenler

        • Dağıtık kilit ya da süreç içi tek-uçuş
    • Okuma replikası· İyi olur

      Yazma tek ana veritabanına, okuma bir ya da birkaç kopyaya gider. Okuma yükü kopyalar arasında bölünür.

      Bilmen gerekenler

      • Replika gecikmesi (replication lag)
      • Yazdığını hemen okuman gerekiyorsa ana sunucudan oku

      Kaynaklar

  4. 04Yazmayı sıraya al

    • Mesaj kuyruğu· Temel

      Bilet satışı, sipariş gibi ağır işlemler önce kuyruğa girer, işçiler (worker) kuyruğu kendi hızlarında tüketir. Ani patlama kuyrukta emilir, veritabanı sakin kalır.

      Bilmen gerekenler

      • Üretici – kuyruk – tüketici
      • Kullanıcıya hemen 'alındı' dön, sonucu sonra bildir
      • Kafka ve RabbitMQ farkı

      Kaynaklar

      • Kafka mı RabbitMQ mu?· İyi olur

        RabbitMQ görev dağıtımı için, Kafka büyük hacimli olay akışı ve tekrar oynatma için. İlk kuyruğun için ikisi de yeterli.

        Bilmen gerekenler

        • Önce işin ne olduğuna bak, aracı sonra seç
      • Geri basınç (backpressure)· Sonra

        Tüketici yetişemediğinde üreticiyi yavaşlatmak ya da reddetmek; kuyruğun sonsuza kadar şişmesini engeller.

        Bilmen gerekenler

        • Kuyruk uzunluğuna alarm kur
    • Tekrar güvenliği (idempotency)· Temel

      Kuyrukta aynı mesaj iki kez işlenebilir; ödemenin iki kez çekilmemesi için işlemin tekrar çalıştırılabilir olması gerekir.

      Bilmen gerekenler

      • İstek başına benzersiz anahtar
      • İşlenmiş anahtarları kaydet

      Kaynaklar

    • Okuma/yazma ayrımı (CQRS)· Sonra

      Yazma modelini ve okuma modelini ayırmak; her biri kendi ihtiyacına göre ölçeklenir ve depolanır.

      Bilmen gerekenler

      • Olay temelli güncelleme
      • Karmaşıklığı bedeli: gerçekten gerekiyorsa

      Kaynaklar

  5. 05Dayanıklı ve görünür kıl

    • Devre kesici (circuit breaker)· İyi olur

      Yanıt vermeyen bir bağımlılığa istek göndermeyi bir süre durdurur; sistemin geri kalanı onunla birlikte çökmez.

      Bilmen gerekenler

      • Zaman aşımı + yeniden deneme (üstel bekleme ile)
      • Yedek davranış (fallback)

      Kaynaklar

    • Otomatik ölçekleme· İyi olur

      Kubernetes gibi araçlar yüke göre uygulama sunucusu sayısını artırır; ama veritabanı bunu otomatik yapamaz, bu yüzden önceki katmanlar şart.

      Bilmen gerekenler

      • CPU ve istek sayısına göre ölçekleme
      • Ölçeklemenin soğuk başlangıç gecikmesi

      Kaynaklar

    • İzleme ve yük testi· Temel

      Neyin yavaşladığını görmeden ölçeklenemezsin. Büyük günden önce sistemi kasıtlı olarak yükle ve nerede kırıldığını öğren.

      Bilmen gerekenler

      • Gecikme (p95/p99), hata oranı, doygunluk
      • Üretime benzer ortamda yük testi

      Kaynaklar