Cache-Control header'ı output cache değildir: handler sayacıyla kanıt
Yazar, Cache-Control header'ı ile ASP.NET Core output caching'i aynı handler sayacıyla karşılaştırıyor. Header yalnızca istemciye yönelik bir mesaj olduğu için handler her çağrıda çalışıyor, output cache ise yanıtı sunucuda saklayıp handler'ı bir kez çalıştırıyor. ASP.NET Core ile önbellek kuranlar için somut bir uyarı.
Kilit noktalar
- Cache-Control header'ı istemci ve ara katmanlara yöneliktir; sunucuda yanıt saklamaz
- Aynı handler'ı on kez çağırma deneyinde header endpoint'i on kez, output cache endpoint'i bir kez çalıştı
- Output caching yanıtı sunucuda bellekte tutar ve handler'ı atlar
- EvictByTagAsync("reports") ile etiketli girişler istek anında temizlenebilir
- Kullanıcıya özel endpoint'lerde SetVaryByHeader veya vary-by-query politikası olmadan output cache kullanmamak gerekir
Yazar, okunma oranı yüksek bir endpoint'e 'cache eklediğini' ama veritabanı yükünün hiç değişmediğini fark etmiş. Sebep, Cache-Control: public, max-age=60 header'ının tarayıcı, CDN veya proxy gibi yanıtı tutan taraflara yönelik bir yönerge olması; sunucuda hiçbir şey saklamaması. Bunu bir sayaçla göstermek için iki endpoint kurmuş ve her birinde handler'da bir sayacı artırmış.
On çağrıda header'lı endpoint handler'ı on kez çalıştırırken, CacheOutput ile işaretlenen endpoint yalnızca bir kez çalışmış; sonraki çağrılar saklanan yanıtı almış. EvictByTagAsync ile etiket düşürülünce handler bir kez daha çalışmış. Ayrıca ResponseCaching middleware'inin header'lara uyması için birçok koşulun birden sağlanması gerektiği belirtiliyor. Yazar, kullanıcıya özel endpoint'lerde dikkatli olunmasını ve veri katmanında HybridCache'in daha uygun olabileceğini de hatırlatıyor.
Gerçek dünyada kullanımı
- Herkese açık bir ürün listesi endpoint'i, saniyede çok sayıda istekte veritabanı sorgusunu tekrar etmeden sunmak
- Her kullanıcı için aynı görünen durum sayfası veya raporu, veri değişince etiketle yenilemek
- Çok sayıda endpoint'in aynı sorguyu farklı biçimde kullandığı durumda, yanıt yerine veri katmanında HybridCache ile önbellek kurmak
Neden önemli
Cache-Control header'ı tek başına sunucu yükünü azaltmaz; veritabanı yükünü gerçekten düşürmek için ASP.NET Core output caching veya veri katmanı önbelleği kullanmak gerekir. Önbelleğin çalışıp çalışmadığını handler sayacı gibi bir ölçümle doğrulamak en güvenli yol.