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

Web uygulamanızı sunarken anındalık ve güncelliği dengelemenize yardımcı olacak ek bir araç.

Neler yayınlandı?

stale-while-revalidate, geliştiricilerin anındalık (önbelleğe alınmış içeriği hemen yükleme) ve güncellik (önbelleğe alınmış içerikte yapılan güncellemelerin gelecekte kullanılmasını sağlama) arasında denge kurmasına yardımcı olur. Düzenli olarak güncellenen bir üçüncü taraf web hizmeti veya kitaplığı kullanıyorsanız ya da birinci taraf öğelerinizin kullanım ömrü kısaysa stale-while-revalidate, mevcut önbelleğe alma politikalarınıza faydalı bir ek olabilir.

Cache-Control yanıt başlığınızda max-age ile birlikte stale-while-revalidate ayarı, Chrome 75 ve Firefox 68'de desteklenir.

stale-while-revalidate özelliğini desteklemeyen tarayıcılar bu yapılandırma değerini sessizce yoksayar ve max-age değerini kullanır. Bu konuyu birazdan açıklayacağım.

Bu ne anlama geliyor?

stale-while-revalidate ifadesini iki bölüme ayıralım: Önbelleğe alınmış bir yanıtın eski olabileceği fikri ve yeniden doğrulama süreci.

Öncelikle, tarayıcı önbelleğe alınmış bir yanıtın "eski" olup olmadığını nasıl anlar? stale-while-revalidate içeren bir Cache-Control yanıt başlığı, max-age da içermelidir ve max-age aracılığıyla belirtilen saniye sayısı, güncelliğini yitirme durumunu belirler. max-age değerinden daha yeni olan tüm önbelleğe alınmış yanıtlar yeni, daha eski önbelleğe alınmış yanıtlar ise eski olarak kabul edilir.

Yerel olarak önbelleğe alınan yanıt hâlâ güncelse tarayıcının isteğini yerine getirmek için olduğu gibi kullanılabilir. stale-while-revalidate açısından bu senaryoda yapılması gereken bir şey yoktur.

Ancak önbelleğe alınan yanıt eskiyse yaşa dayalı başka bir kontrol yapılır: Ö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ığa denk gelirse tarayıcının isteğini yerine getirmek için kullanılır. Aynı zamanda, önbelleğe alınmış yanıtın kullanımını geciktirmeyecek şekilde ağa bir "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ınmış olan her şeyin yerini alır ve gelecekteki max-age karşılaştırmaları sırasında kullanılan "yenilik" zamanlayıcısını sıfırlar.

Ancak eski önbelleğe alınmış yanıt, stale-while-revalidate zaman aralığının dışına çıkacak kadar eskiyse tarayıcının isteğini yerine getirmez. Tarayıcı bunun yerine 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 saati (daha spesifik olarak, saati geçen dakika sayısını) döndüren bir HTTP API'nin basit bir ö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, sonraki 1 saniye içinde zaman isteği tekrarlanırsa önceden önbelleğe alınan değerin hâlâ yeni 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ğinin yerine getirilmesi hem de önbellek yeniden doğrulaması ağdan yanıt alınmasına bağlı olur.

Bu üç farklı durumun dökümünü ve her birinin örneğimiz için geçerli olduğu zaman aralığını aşağıda bulabilirsiniz:

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

Yaygın kullanım alanları nelerdir?

"Saat başından sonraki dakika" API hizmetiyle ilgili yukarıdaki örnek yapay olsa da beklenen kullanım alanını gösterir. Bu hizmetler, yenilenmesi gereken ancak bir dereceye kadar güncelliğini yitirmiş bilgilerin kabul edilebilir olduğu bilgileri sağlar.

Daha gerçekçi örnekler, mevcut hava durumu koşulları veya son bir saat içinde yazılan en önemli haber başlıkları için bir API olabilir.

Genellikle, bilinen bir aralıkta güncellenen, birden çok kez istenmesi muhtemel olan ve bu aralıkta statik olan tüm yanıtlar, max-age aracılığıyla kısa süreli önbelleğe alma için iyi birer adaydır. max-age ile birlikte stale-while-revalidate kullanmak, gelecekteki isteklerin ağ yanıtını engellemeden daha yeni içeriklerle önbellekten karşılanma olasılığını artırır.

Hizmet çalışanlarıyla nasıl etkileşim kurar?

stale-while-revalidate hakkında bir şeyler duyduysanız bu muhtemelen bir hizmet çalışanında kullanılan tarifler bağlamında olmuştur.

Cache-Control başlığı aracılığıyla stale-while-revalidate kullanımı, hizmet çalışanında kullanımına benzer. Güncellik ödünleri ve maksimum kullanım ömürleriyle ilgili aynı hususların çoğu geçerlidir. Ancak hizmet çalışanı tabanlı bir yaklaşım uygulamaya mı yoksa yalnızca Cache-Control başlık yapılandırmasına mı güveneceğinize karar verirken göz önünde bulundurmanız gereken birkaç nokta vardır.

Şu durumlarda hizmet çalışanı yaklaşımını kullanın:

  • Web uygulamanızda zaten bir hizmet çalışanı kullanıyorsanız.
  • Önbelleklerinizin içeriği üzerinde ayrıntılı kontrole ihtiyacınız var ve en son kullanılan sona erme politikası gibi bir şey uygulamak istiyorsunuz. Workbox'ın Cache Expiration 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 Broadcast Cache Update modülü bu konuda yardımcı olabilir.
  • Tüm modern tarayıcılarda bu stale-while-revalidate davranışına ihtiyacınız vardır.

Şu durumlarda Cache-Control yaklaşımını kullanın:

  • Web uygulamanız için hizmet çalışanı dağıtma ve sürdürme yüküyle uğraşmak istemiyorsanız.
  • Tarayıcının otomatik önbellek yönetiminin, yerel önbelleklerinizin çok fazla büyümesini engellemesine izin vermenizde bir sakınca yoktur.
  • Şu anda tüm modern tarayıcılarda desteklenmeyen bir yaklaşımı kullanmak sizin için sorun teşkil etmiyorsa (Temmuz 2019 itibarıyla; destek gelecekte artabilir).

Bir hizmet çalışanı kullanıyorsanız ve bazı yanıtlar için Cache-Control başlığı aracılığıyla stale-while-revalidate etkinleştirilmişse hizmet çalışanı, genellikle bir isteğe yanıt verme konusunda "ilk şansa" sahip olur. 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