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

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

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:

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

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

Samuel Zeller'in hero görseli.