Gereksiz Veriler Vergisi
B2B SaaS platformlarında, kullanıcılar sürekli olarak API’nizi güncellemeler için sorguluyor. Örneğin, bir dashboard her 60 saniyede bir GET /api/system-config isteği yapıyor. Payload 200KB’lık JSON veri içeriyor. Eğer yapılandırma üç gün boyunca değişmemişse, sunucunuz veri serileştirmek için CPU döngüleri harcıyor ve her kullanıcı için günde 1,440 kez aynı 200KB dosyasını iletmek için AWS çıkış ücretleri ödüyorsunuz.
Temel Redis caching, veritabanı sorgusunu hızlandırır, ancak yükün ağa gitmesini durdurmaz. Ağı tamamen boşaltmak için API’niz, tarayıcının yerel HTTP önbelleğini ETags ve Stale-While-Revalidate yönergesi ile kullanmalıdır.
Çözüm: 304 Not Modified
Bir ETag (Entity Tag), yanıt gövdesinin kriptografik bir hash’idir (MD5 checksum gibi). Sunucu JSON’u gönderdiğinde, başlıkta ETag’i de ekler.
Tarayıcı bir sonraki kez bu uç noktayı talep ettiğinde, If-None-Match: {ETag} başlığı ile birlikte bir istek gönderir. Sunucu, mevcut verilerin hash’ini hızlıca hesaplar. Eğer hash’ler eşleşirse, veri değişmemiş demektir! Sunucu 200KB’lık JSON gövdesini göndermek yerine, yükü derhal düşürerek küçük, boş bir 304 Not Modified durum kodu ile yanıt verir. Tarayıcı, yerel önbelleğini kullanmanın güvenli olduğunu bilir, bu da ağ transfer sürelerini 1 milisaniyeye düşürür.
Laravel’de ETag Middleware Tasarlamak
Okuma-yazma olmayan API yollarımızda bunu özel bir Laravel Middleware katmanı kullanarak küresel olarak uygulayabiliriz.
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class ETagCacheMiddleware
{
public function handle(Request $request, Closure $next)
{
// 1. Sadece güvenli, sadece okuma yöntemlerini önbelleğe al
if (! $request->isMethod('GET') && ! $request->isMethod('HEAD')) {
return $next($request);
}
$response = $next($request);
// 2. Nihai JSON içeriğinin benzersiz bir MD5 hash'ini oluştur
$etag = md5($response->getContent());
$requestEtag = str_replace('"', '', $request->header('If-None-Match', ''));
// 3. Tarayıcının hash'i sunucunun hash'i ile eşleşiyorsa, yükü düşür!
if ($requestEtag === $etag) {
$response->setNotModified(); // Otomatik olarak 304'e dönüştürür ve gövdeyi boşaltır
}
// 4. ETag ve nihai performans direktifi: stale-while-revalidate'yi ekle.
// Bu tarayıcıya: "Önbellek versiyonunu hemen göster, ancak arka planda sunucuyu güncellemeler için kontrol et." der.
$response->withHeaders([
'ETag' => '"' . $etag . '"',
'Cache-Control' => 'public, max-age=60, stale-while-revalidate=300'
]);
return $response;
}
}
Mühendislik ROI’si
ETags ve stale-while-revalidate uygulayarak, veri depolama yükünü bulut sunucularından kullanıcıların yerel cihazlarına kaydırmış olursunuz. Sunucu yanıt süreleriniz işlevsel olarak anlık hale gelir, ağ bant genişliği maliyetleri düşer ve Next.js ön yüzünüz, değişmeyen verilerin fiziksel hat üzerinden geçmesini beklemediği için yerel gibi hissedilir.
Kaynak: Orijinal Makale


