Web uygulamanızı yayınlarken anlıklığı ve yeniliği dengelemenize yardımcı olacak ek bir araç.
Hangi ürünler gönderildi?
stale-while-revalidate
, geliştiricilerin anlıklık (önbelleğe alınmış içeriğin hemen yüklenmesi) ile güncellik (önbelleğe alınmış içerikteki güncellemelerin gelecekte kullanılmasının sağlanması) arasında denge kurmasına yardımcı olur. Düzenli bir programda güncellenen bir üçüncü taraf web hizmetiniz veya kitaplığınız varsa ya da birinci taraf öğelerinizin kullanım süreleri kısaysa stale-while-revalidate
, mevcut önbelleğe alma politikalarınıza yararlı bir katkı olabilir.
Cache-Control
yanıt üstbilginizde max-age
ile birlikte stale-while-revalidate
ayarlama desteği Chrome 75 ve Firefox 68'de kullanılabilir.
stale-while-revalidate
değerini desteklemeyen tarayıcılar, bu yapılandırma değerini sessizce yoksayar ve kısa süre içinde açıklayacağım gibi max-age
değerini kullanır.
Bu ne anlama geliyor?
stale-while-revalidate
değerini iki bölüme ayıralım: Önbelleğe alınmış bir yanıtın güncel olmayabileceği fikri ve yeniden doğrulama süreci.
Öncelikle, tarayıcı önbelleğe alınmış bir yanıtın "güncelliğini yitirmiş" olup olmadığını nasıl anlar? stale-while-revalidate
içeren bir Cache-Control
yanıt başlığı, max-age
de içermelidir. Güncelliğini yitirme durumunu belirleyen, max-age
aracılığıyla belirtilen saniye sayısıdır. max-age
tarihinden yeni önbelleğe alınan yanıtlar güncel, daha eski önbelleğe alınan yanıtlar ise güncel değildir.
Yerel olarak önbelleğe alınan yanıt hâlâ güncelse tarayıcının isteğini karşılamak için olduğu gibi kullanılabilir. stale-while-revalidate
açısından, bu senaryoda herhangi bir işlem yapmanız gerekmez.
Ancak önbelleğe alınan yanıt güncel değilse yaş temelli başka bir kontrol gerçekleştirilir: Önbelleğe alınan yanıtın yaşı, stale-while-revalidate
ayarı tarafından sağlanan ek zaman aralığında mı?
Eski bir yanıtın yaşı bu aralık içindeyse tarayıcı isteğinin karşılanması için kullanılır. Aynı zamanda, önbelleğe alınmış yanıtın kullanımını geciktirmeyecek şekilde ağa "yeniden doğrulama" isteği gönderilir. 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, daha önce önbelleğe alınan her şeyin yerini alır ve gelecekteki tüm max-age
karşılaştırmalarında kullanılan "tazelik" zamanlayıcısı sıfırlanır.
Ancak, önbelleğe alınmış eski yanıt, stale-while-revalidate
zaman aralığının dışında kalacak kadar eskiyse tarayıcı isteğini yerine getirmez. Bunun yerine tarayıcı, ağdan bir yanıt alır ve bu yanıtı hem ilk isteği yerine getirmek hem de yerel önbelleği yeni bir yanıtla doldurmak için kullanır.
Canlı Örnek
Aşağıda, geçerli zamanı (daha ayrıntılı olarak, saatin kaç dakika geçtiğini) döndüren basit bir HTTP API örneği verilmiştir.
Bu senaryoda web sunucusu, HTTP yanıtında şu Cache-Control
üst bilgisini kullanır:
Cache-Control: max-age=1, stale-while-revalidate=59
Bu ayar, saatle ilgili bir istek sonraki 1 saniye içinde tekrarlanırsa daha önce önbelleğe alınan değerin hâlâ güncel olacağı ve yeniden doğrulama yapılmadan olduğu gibi kullanılacağı anlamına gelir.
Bir istek 1 ila 60 saniye sonra 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ği gelecekte kullanılmak üzere yeni bir değerle doldurmak için yeniden doğrulama isteği gönderilir.
Bir istek 60 saniyeden uzun bir süre sonra tekrarlanırsa eski yanıt hiç kullanılmaz ve hem tarayıcının isteği hem de önbelleğin yeniden doğrulanması, ağdan yanıt alınmasına bağlı olur.
Aşağıda, bu üç farklı durumun dökümü ve her birinin örneğimizde geçerli olduğu zaman aralığı verilmiştir:
Yaygın kullanım alanları nelerdir?
"Saatten dakikalar sonra" API hizmeti için yukarıdaki örnek kurgusal olsa da beklenen kullanım alanını göstermektedir. Bu kullanım alanı, yenilenmesi gereken ancak belirli bir düzeyde eskiliğin kabul edildiği bilgiler sağlayan hizmetlerdir.
Daha az yapay örnekler arasında mevcut hava koşullarıyla ilgili bir API veya son bir saat içinde yazılan en önemli haberler yer alabilir.
Genellikle, bilinen bir aralıkta güncellenen, birden çok kez istenme olasılığı yüksek olan ve bu aralık içinde statik olan tüm yanıtlar, max-age
aracılığıyla kısa süreli önbelleğe alma için iyi bir adaydır. max-age
'a ek olarak stale-while-revalidate
kullanmak, gelecekteki isteklerin ağ yanıtında engelleme olmadan daha yeni içeriklerle önbellekten karşılanma olasılığını artırır.
Service workers ile nasıl etkileşim kurar?
stale-while-revalidate
'ten haberdar olduysanız muhtemelen hizmet çalışanı içinde kullanılan reçeteler bağlamında duymuşsunuzdur.
Cache-Control
başlığı aracılığıyla eski verileri yeniden doğrulama özelliğinin kullanımı, bir hizmet çalışanında kullanımıyla bazı benzerlikler taşır ve tazelik dengesi ile maksimum süreler hakkındaki aynı hususların çoğu geçerlidir. Ancak, hizmet çalışanı tabanlı bir yaklaşımı mı uygulayacağınıza yoksa yalnızca Cache-Control
başlık yapılandırmasına mı güveneceğinize karar verirken dikkate almanız gereken birkaç nokta vardır.
Aşağıdaki durumlarda hizmet çalışanı yaklaşımını kullanın:
- Web uygulamanızda zaten bir hizmet çalışanı kullanıyorsanız.
- Önbelleğinizin içerikleri üzerinde ayrıntılı kontrole ihtiyacınız var ve en son kullanılmayan öğelerin süresinin sona ermesi gibi bir politika uygulamak istiyorsunuz. Workbox'un Önbelleğin Süresinin Dolması modülü bu konuda size 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'un Yayın Önbelleği Güncelleme modülü bu konuda size yardımcı olabilir.
- Tüm modern tarayıcılarda bu
stale-while-revalidate
davranışına ihtiyacınız vardır.
Aşağıdaki durumlarda Cache-Control yaklaşımını kullanın:
- Web uygulamanız için bir hizmet çalışanı dağıtma ve sürdürme masrafıyla uğraşmak istemiyorsunuz.
- Tarayıcı otomatik önbellek yönetiminin yerel önbelleğinizin çok fazla büyümesini engellemesine izin verebilirsiniz.
- Şu anda tüm modern tarayıcılarda desteklenmeyen bir yaklaşımı kullanabilirsiniz (Temmuz 2019 itibarıyla; gelecekte destek kapsamı genişleyebilir).
Bir hizmet çalışanı kullanıyorsanız ve bazı yanıtlar için Cache-Control
üst bilgisi aracılığıyla stale-while-revalidate
'ü etkinleştirdiyseniz hizmet çalışanı, genel olarak bir isteğe yanıt verme konusunda "ilk hakkı" elde eder. Hizmet çalışanı yanıt vermemeye karar verirse veya yanıt oluşturma sürecinde fetch()
kullanarak ağ isteği yaparsa Cache-Control
başlığı aracılığıyla yapılandırılan davranış geçerli olur.
Daha fazla bilgi
stale-while-revalidate
yanıtı- İlk
stale-while-revalidate
spesifikasyonunu kapsayan RFC 5861. - Bu sitedeki "Ağ güvenilirliği" kılavuzundaki HTTP önbelleği: İlk savunma hattınız başlıklı makaleyi inceleyin.
Samuel Zeller tarafından oluşturulan hero resim.