Web uygulamanızı yayınlarken anlıklığı ve güncelliği dengelemenize yardımcı olacak ek bir araç.
Hangi ürünler gönderildi?
stale-while-revalidate
, geliştiricilerin önbelleğe alınmış içeriği hemen yükleme ve yenilik arasında denge kurmalarına yardımcı olarak önbelleğe alınmış içerikteki güncellemelerin gelecekte kullanılmasını sağlar. 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 eskiyse yaşa bağlı 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ığı içinde mi?
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ınmış yanıtla aynı bilgileri içerebilir veya farklı olabilir. Her iki durumda da ağ yanıtı yerel olarak depolanır, önceden önbellektekinin değiştirilir ve gelecekteki max-age
karşılaştırmaları sırasında kullanılan "güncellik" 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 bir HTTP API'sinin basit bir ö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, zaman için bir istek sonraki 1 saniye içinde tekrarlanırsa önceden önbelleğe alınan değerin güncel olacağı ve herhangi bir 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, önbelleği gelecekte kullanılmak üzere yeni bir değerle doldurmak için "arka planda" bir yeniden doğrulama isteği yapılır.
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?
Yukarıdaki "saatten sonraki dakikalar" API hizmeti örneği güvenilir olmasa da bu örnek, beklenen kullanım alanını göstermektedir. Bu hizmet, yenilenmesi gereken ancak bir dereceye kadar eskiliğin kabul edilebilir olduğu bilgiler sağlar.
Daha az çelişkili örnekler, mevcut hava koşulları için bir API veya son bir saat içinde yazılan en çok okunan haber manşetleri olabilir.
Genel olarak, bilinen bir aralıkla güncellenen, muhtemelen birden çok kez istenen ve bu aralık içinde statik 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
kullanılması, gelecekteki isteklerin bir ağ yanıtını engellemeden 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 yeniden doğrulama sırasında eski verileri kullanmanın, bir hizmet çalışanında kullanılmasıyla bazı benzerlikleri vardı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ıyorsunuz.
- Önbelleklerinizin içerikleri üzerinde ayrıntılı bir kontrole ihtiyacınız ve en az son kullanılan son kullanma politikası gibi bir politika uygulamak istiyorsanız. Workbox'ın Önbellek Süresi Sonu 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üncelleme 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 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ı, genelde 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 bir ağ isteği gönderirse Cache-Control
başlığı aracılığıyla yapılandırılan davranış geçerli olur.
Daha fazla bilgi
- Getirme API spesifikasyonunda
stale-while-revalidate
yanıtı var. - İlk
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 görseli.