Web uygulamanızı sunarken anındalık ve güncellik arasında denge kurmanıza yardımcı olacak ek bir araç.
Neler gönderildi?
stale-while-revalidate
, geliştiricilerin anındalık (önbelleğe alınmış içeriği hemen yükleme ve tazelik) arasında denge kurmasına yardımcı olur. Önbelleğe alınan içerikte yapılacak güncellemelerin gelecekte kullanılmasını sağlama. Düzenli bir plana göre güncellenen bir üçüncü taraf web hizmeti veya kitaplığınız varsa ya da birinci taraf öğelerinizin ömrü genellikle kısaysa stale-while-revalidate
, mevcut önbelleğe alma politikalarımıza faydalı bir katkı sağlayabilir.
Cache-Control
yanıt başlığınızda max-age
ile birlikte stale-while-revalidate
belirleme desteği Chrome 75 ve Firefox 68'de mevcuttur.
stale-while-revalidate
özelliğini desteklemeyen tarayıcılar, sessizce bu yapılandırma değerini yok sayar ve birazdan açıklayacağım gibi max-age
kullanır.
Bu ne anlama geliyor?
stale-while-revalidate
öğesini iki bölüme ayıralım: önbelleğe alınmış bir yanıtın eski olabileceği fikri ve yeniden doğrulama işlemi.
Öncelikle, tarayıcı önbelleğe alınan bir yanıtın "eski" olup olmadığını nasıl biliyor? stale-while-revalidate
içeren bir Cache-Control
yanıt üstbilgisi, max-age
değerini de içermelidir. max-age
aracılığıyla belirtilen saniye sayısı da eskiliği belirler. max-age
değerinden daha yeni önbelleğe alınmış yanıtlar yeni kabul edilir ve önbelleğe alınan daha eski yanıtlar eski olarak kabul edilir.
Yerel olarak önbelleğe alınan yanıt hâlâ yeniyse tarayıcının isteğini yerine getirmek için olduğu gibi kullanılabilir. stale-while-revalidate
açısından, bu senaryoda yapılacak bir şey yoktur.
Ancak, önbelleğe alınan yanıt eskiyse yaşa bağlı başka bir kontrol gerçekleştirilir:
stale-while-revalidate
ayarı tarafından sağlanan ek zaman aralığında önbelleğe alınan yanıtın yaşı var mı?
Eski yanıtın tarihi bu pencereye denk gelirse tarayıcının isteğini yerine getirmek için kullanılır. Aynı zamanda, önbelleğe alınan yanıtın kullanımını geciktirmeyecek şekilde ağa yönelik bir "yeniden doğrulama" isteği yapılır. Döndürülen yanıt, daha önce önbelleğe alınan yanıtla aynı bilgileri içerebilir veya farklı olabilir. Her iki durumda da ağ yanıtı yerel olarak depolanır, önceki önbellek yerine geçer ve gelecekteki max-age
karşılaştırmaları sırasında kullanılan "tazelik" zamanlayıcısı sıfırlanır.
Bununla birlikte, önbelleğe alınmış eski yanıt stale-while-revalidate
zaman aralığının dışında kalacak kadar eskiyse tarayıcının isteğini yerine getirmez. Tarayıcı, bunun yerine ağdan bir yanıt alır ve hem ilk isteği yerine getirmek hem de yerel önbelleği yeni bir yanıtla doldurmak için bu yanıtı kullanır.
Canlı Örnek
Aşağıda geçerli saati, daha spesifik olarak saati geçen dakika sayısını döndürmek için kullanılan basit bir HTTP API örneği verilmiştir.
Bu senaryoda, web sunucusu HTTP yanıtında şu Cache-Control
üstbilgisini kullanır:
Cache-Control: max-age=1, stale-while-revalidate=59
Bu ayar, belirli bir zaman isteği sonraki 1 saniye içinde tekrarlanırsa önceden önbelleğe alınan değerin yeni kalacağı ve herhangi bir yeniden doğrulama olmadan olduğu gibi kullanılacağı anlamına gelir.
Bir istek 1 ile 60 saniye arasında tekrarlanırsa önbelleğe alınan değer eski olur ancak API isteğini yerine getirmek için kullanılır. Aynı zamanda, "arka planda", önbelleğin gelecekte kullanılmak üzere yeni bir değerle doldurulması için bir yeniden doğrulama isteği de yapılır.
Bir istek 60 saniyeden uzun bir süre sonra tekrarlanırsa eski yanıt hiç kullanılmaz ve hem tarayıcı isteğinin yerine getirilmesi hem de önbelleğin yeniden doğrulanması, ağdan yanıt almaya bağlı olur.
Aşağıda bu üç farklı durumun dökümü ve her birinin örneğimiz için geçerli olduğu zaman aralığı bulunmaktadır:
Yaygın kullanım alanları nelerdir?
Yukarıdaki "saatten sonraki dakikalar" API hizmeti için verilen örnek uygunsuz olsa da beklenen kullanım alanını, yani yenilenmesi gereken ancak bir dereceye kadar eskiliğin kabul edilebilir olduğu bilgileri sağlayan hizmetleri göstermektedir.
Mevcut hava koşullarıyla ilgili bir API veya son bir saat içinde en çok okunan haber manşetleri, daha az tahmin edilebilir sonuçlar verebilir.
Genel olarak, bilinen bir aralıkta güncellenen, muhtemelen birden çok kez istenen ve bu aralık dahilinde durağan olan herhangi bir yanıt, max-age
aracılığıyla kısa süreli önbelleğe alma için iyi bir adaydır. max-age
özelliğine ek olarak stale-while-revalidate
kullanmak, gelecekteki isteklerin ağ yanıtını engellemeden daha yeni içeriklerle önbellekten karşılanma olasılığını artırır.
Service Worker'larla nasıl etkileşime girer?
stale-while-revalidate
ürününü duyduysanız bunun bir servis çalışanı içinde kullanılan tarifler bağlamında olduğunu düşünebilirsiniz.
Bir Cache-Control
üst bilgisi aracılığıyla eski ile yeniden doğrulama özelliğini kullanmak, bu özelliğin bir Service Worker'da kullanımıyla ilgili bazı benzerlikleri beraberinde getirir. Aynı zamanda, yenilenme ödünleri ve maksimum kullanım ömrü ile ilgili dikkat edilmesi gereken noktaların birçoğu da geçerlidir. Bununla birlikte, Service Worker tabanlı bir yaklaşım uygulamaya veya yalnızca Cache-Control
üst bilgi yapılandırmasına güvenmeye karar verirken dikkate almanız gereken birkaç nokta vardır.
Aşağıdaki durumlarda Service Worker yaklaşımı kullanın...
- Web uygulamanızda zaten bir Service Worker kullanıyorsunuz.
- Önbelleklerinizin içeriği üzerinde ayrıntılı kontrole ihtiyacınız vardır ve en az kullanılan son kullanma politikası gibi bir uygulama uygulamak istersiniz. Workbox'ın Önbelleğin Kullanım Süresi modülü bu konuda yardımcı olabilir.
- Yeniden doğrulama adımı sırasında arka planda eski bir yanıt değiştiğinde bildirim almak istiyorsunuz. Workbox'ın Yayın Önbelleği Güncellemesi modülü bu konuda yardımcı olabilir.
- Tüm modern tarayıcılarda bu
stale-while-revalidate
davranışına ihtiyacınız vardır.
Aşağıdaki durumlarda Önbellek Kontrolü yaklaşımı kullanın...
- Web uygulamanız için bir Service Worker dağıtma ve bakımının ek yüküyle uğraşmak istemezsiniz.
- Tarayıcının otomatik önbellek yönetiminin, yerel önbelleklerinizin çok büyümesini önlemesine izin verebilirsiniz.
- Şu anda tüm modern tarayıcılarda desteklenmeyen bir yaklaşım benimseyebilirsiniz (Temmuz 2019 itibarıyla; destek gelecekte artabilir).
Service Worker kullanıyorsanız ve ayrıca Cache-Control
başlığı aracılığıyla bazı yanıtlar için stale-while-revalidate
politikasını etkinleştirdiyseniz Service Worker genel olarak bir isteğe yanıt verirken "ilk kırma" işlemini gerçekleştirir. Service Worker yanıt vermemeye karar verirse veya yanıt oluşturma sürecinde fetch()
kullanarak ağ isteğinde bulunursa Cache-Control
başlığı aracılığıyla yapılandırılan davranış geçerlilik kazanır.
Daha fazla bilgi
stale-while-revalidate
yanıtını görebilirsiniz.- Başlangıç
stale-while-revalidate
spesifikasyonunu kapsayan RFC 5861. - Bu sitedeki "Ağ güvenilirliği" kılavuzundan HTTP önbelleği: ilk savunma hattınız.
Samuel Zeller'in hero resmi.