Yüksek trafikli bir video sitesi, trend sayfası akışı için veritabanı sorgularını dakikada 4.000'den 50'nin altına düşürdü ve Varnish ile Edge Side Includes (ESI) kullanarak tam sayfa önbelleğe almadan (whole-page caching) parçalı önbelleğe almaya (fragment caching) geçerek 95. yüzdelik (95th-percentile) yanıt süresini 380 ms'den 40 ms'ye indirdi.

Sitenin neden farklı bir önbellek stratejisine ihtiyacı vardı

Günün en çok izlenen kliplerini gösteren ana sayfa, bir bölgedeki hemen hemen her ziyaretçi için aynı görünür: Bir milyon kullanıcı için HTML'in yaklaşık yüzde 95'i aynıyken, kalan yüzde 5'lik kısım giriş yapmış kullanıcının adı veya bir arama kutusu gibi kişisel verileri içerir. Mühendislik ekibi iki istenmeyen seçenekle karşı karşıya kaldı:

  • Tüm sayfayı önbelleğe almak ve giriş yapmış kullanıcılara güncel olmayan (stale) kişisel veriler sunma riskini göze almak.
  • Önbelleği tamamen devre dışı bırakmak ve her isteğin veritabanını zorlamasına izin vermek.

Her iki yaklaşım da kullanıcı deneyimini bozuyordu. Ekip, bir ters vekil sunucunun (reverse-proxy) sayfayı ağın uç noktalarında (edge) bağımsız olarak önbelleğe alınmış parçalardan birleştirmesine olanak tanıyan bir teknik olan ESI'ye yöneldi.

Parçalı önbelleğe alma nasıl yapılandırıldı

Açık kaynaklı HTTP hızlandırıcı Varnish, sayfayı değiştirilebilir üç parçadan oluşan bir iskelet olarak ele aldı:

  • Video ızgarası (Video grid) – trend videoların maliyetli, bölge genelindeki listesi. Sık sık değiştiği ancak her anonim ziyaretçi için aynı olduğu için 60 saniye boyunca önbelleğe alınır.
  • Dil değiştirici (Language switcher) – nadiren değişen statik bir UI öğesi. 24 saat boyunca önbelleğe alınır.
  • Üst bilgi (Header) – gerçekten kişisel olan tek parça (kullanıcı adı, avatar, bildirimler). Hiçbir zaman önbelleğe alınmaz; Varnish her seferinde isteği uygulama sunucusuna iletir.

Bir istek geldiğinde Varnish, önbelleğe alınmış iskeleti sunar, iki önbelleğe alınmış parçayı yerel deposundan çeker ve backend'den gelen canlı üst bilgiyi yerleştirir.

Önemli rakamlar

Geçişten sonra:

  • Trend sayfası için veritabanı yükü dakikada 4.000 sorgudan 50'nin altına düştü.
    1. yüzdelik gecikme süresi 380 ms'den 40 ms'ye geriledi.

Yaygınlaştırmadan üç pratik ders

1. Grace period'lar (tolerans süreleri) önbellek kaçırmalarını yumuşatır Bir parçanın TTL süresi dolduğunda, Varnish normalde taze içeriği getirmek için duraklayacak ve eş zamanlı backend çağrılarının bir "thundering herd" (gürleyen sürü) etkisine dönüşebileceği bir gecikme artışına neden olacaktır. Bir grace period yapılandırarak Varnish, arka planda önbelleği sessizce yenilerken eski (stale) parçayı sunmaya devam eder. Kullanıcılar herhangi bir duraksama görmez; backend ise istikrarlı ve yönetilebilir bir istek oranı görür.

2. Anonim parçalar için çerezleri (cookies) temizleyin Her isteğe eklenen çerezler, Varnish'in her isteği benzersiz olarak ele almasına neden olur ve önbellek isabetlerini (cache hits) geçersiz kılar. Ekip, video ızgarası ve dil değiştirici için çerezleri temizleyerek bu parçaların agresif bir şekilde önbelleğe alınmasını sağladı. Sadece header parçası çerez taşır; bu da önbellek verimliliğinden ödün vermeden kişiselleştirmeyi korur.

3. Surrogate key'ler (vekil anahtarlar) anında temizlemeyi (purging) sağlar Bazen bir video, örneğin telif hakkı nedenleriyle, derhal kaldırılmalıdır. 60 saniyelik TTL süresinin dolmasını beklemek kabul edilemez. Her bir önbelleğe alınmış parçayı, alttaki video kimliklerini (ID) yansıtan bir surrogate key ile etiketleyerek ekip, her bir uç düğümdeki (edge node) belirli bir videonun tüm kopyalarını anında geçersiz kılan tek bir temizleme (purge) komutu verir. Bu, tam bir önbellek taramasından kaçınır ve sitenin uyumluluğunu sağlar.

Özet: Varnish ve ESI ile yapılan parçalı önbelleğe alma, monolitik ve veritabanına bağımlı bir sayfayı hafif ve yeniden kullanılabilir parçalar kümesine dönüştürerek, kullanıcı başına kişiselleştirmeyi korurken backend yükünü ve gecikmeyi ciddi oranda azaltır.