Yeniden doğrulama yöntemiyle eski içeriği güncel tutma

Web uygulamanızı yayınlarken anlıklığı ve yeniliği dengelemenize yardımcı olacak ek bir araç.

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:

Önceki bölümdeki bilgileri gösteren bir diyagram.

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

Samuel Zeller tarafından oluşturulan hero resim.