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

Web uygulamanızı sunarken anındalık ve güncellik arasında denge kurmanıza yardımcı olacak ek bir araç.

Neler gönderildi?

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

Cache-Control yanıt başlığınızda max-age ile birlikte stale-while-revalidate belirleme desteği Chrome 75 ve Firefox 68'de mevcuttur.

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

Bu ne anlama geliyor?

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

Öncelikle, tarayıcı önbelleğe alınan bir yanıtın "eski" olup olmadığını nasıl biliyor? stale-while-revalidate içeren bir Cache-Control yanıt üstbilgisi, max-age değerini de içermelidir. max-age aracılığıyla belirtilen saniye sayısı da eskiliği belirler. max-age değerinden daha yeni önbelleğe alınmış yanıtlar yeni kabul edilir ve önbelleğe alınan daha eski yanıtlar eski olarak kabul edilir.

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

Ancak, önbelleğe alınan yanıt eskiyse yaşa bağlı başka bir kontrol gerçekleştirilir: stale-while-revalidate ayarı tarafından sağlanan ek zaman aralığında önbelleğe alınan yanıtın yaşı var mı?

Eski yanıtın tarihi bu pencereye denk gelirse tarayıcının isteğini yerine getirmek için kullanılır. Aynı zamanda, önbelleğe alınan yanıtın kullanımını geciktirmeyecek şekilde ağa yönelik bir "yeniden doğrulama" isteği yapılır. 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, önceki önbellek yerine geçer ve gelecekteki max-age karşılaştırmaları sırasında kullanılan "tazelik" zamanlayıcısı sıfırlanır.

Bununla birlikte, önbelleğe alınmış eski yanıt stale-while-revalidate zaman aralığının dışında kalacak kadar eskiyse tarayıcının isteğini yerine getirmez. Tarayıcı, bunun yerine ağdan bir yanıt alır ve hem ilk isteği yerine getirmek hem de yerel önbelleği yeni bir yanıtla doldurmak için bu yanıtı kullanır.

Canlı Örnek

Aşağıda geçerli saati, daha spesifik olarak saati geçen dakika sayısını döndürmek için kullanılan basit bir HTTP API ö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, belirli bir zaman isteği sonraki 1 saniye içinde tekrarlanırsa önceden önbelleğe alınan değerin yeni kalacağı ve herhangi bir yeniden doğrulama olmadan olduğu gibi kullanılacağı anlamına gelir.

Bir istek 1 ile 60 saniye arasında 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ğin gelecekte kullanılmak üzere yeni bir değerle doldurulması için bir yeniden doğrulama isteği de yapılır.

Bir istek 60 saniyeden uzun bir süre sonra tekrarlanırsa eski yanıt hiç kullanılmaz ve hem tarayıcı isteğinin yerine getirilmesi hem de önbelleğin yeniden doğrulanması, ağdan yanıt almaya bağlı olur.

Aşağıda bu üç farklı durumun dökümü ve her birinin örneğimiz için geçerli olduğu zaman aralığı bulunmaktadır:

Önceki bölümde yer alan bilgileri gösteren bir diyagram.

Yaygın kullanım alanları nelerdir?

Yukarıdaki "saatten sonraki dakikalar" API hizmeti için verilen örnek uygunsuz olsa da beklenen kullanım alanını, yani yenilenmesi gereken ancak bir dereceye kadar eskiliğin kabul edilebilir olduğu bilgileri sağlayan hizmetleri göstermektedir.

Mevcut hava koşullarıyla ilgili bir API veya son bir saat içinde en çok okunan haber manşetleri, daha az tahmin edilebilir sonuçlar verebilir.

Genel olarak, bilinen bir aralıkta güncellenen, muhtemelen birden çok kez istenen ve bu aralık dahilinde durağan 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 kullanmak, gelecekteki isteklerin ağ yanıtını engellemeden daha yeni içeriklerle önbellekten karşılanma olasılığını artırır.

Service Worker'larla nasıl etkileşime girer?

stale-while-revalidate ürününü duyduysanız bunun bir servis çalışanı içinde kullanılan tarifler bağlamında olduğunu düşünebilirsiniz.

Bir Cache-Control üst bilgisi aracılığıyla eski ile yeniden doğrulama özelliğini kullanmak, bu özelliğin bir Service Worker'da kullanımıyla ilgili bazı benzerlikleri beraberinde getirir. Aynı zamanda, yenilenme ödünleri ve maksimum kullanım ömrü ile ilgili dikkat edilmesi gereken noktaların birçoğu da geçerlidir. Bununla birlikte, Service Worker tabanlı bir yaklaşım uygulamaya veya yalnızca Cache-Control üst bilgi yapılandırmasına güvenmeye karar verirken dikkate almanız gereken birkaç nokta vardır.

Aşağıdaki durumlarda Service Worker yaklaşımı kullanın...

  • Web uygulamanızda zaten bir Service Worker kullanıyorsunuz.
  • Önbelleklerinizin içeriği üzerinde ayrıntılı kontrole ihtiyacınız vardır ve en az kullanılan son kullanma politikası gibi bir uygulama uygulamak istersiniz. Workbox'ın Önbelleğin Kullanım Süresi 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üncellemesi 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 Service Worker dağıtma ve bakımının ek yüküyle uğraşmak istemezsiniz.
  • Tarayıcının otomatik önbellek yönetiminin, yerel önbelleklerinizin çok büyümesini önlemesine izin verebilirsiniz.
  • Şu anda tüm modern tarayıcılarda desteklenmeyen bir yaklaşım benimseyebilirsiniz (Temmuz 2019 itibarıyla; destek gelecekte artabilir).

Service Worker kullanıyorsanız ve ayrıca Cache-Control başlığı aracılığıyla bazı yanıtlar için stale-while-revalidate politikasını etkinleştirdiyseniz Service Worker genel olarak bir isteğe yanıt verirken "ilk kırma" işlemini gerçekleştirir. Service Worker yanıt vermemeye karar verirse veya yanıt oluşturma sürecinde fetch() kullanarak ağ isteğinde bulunursa Cache-Control başlığı aracılığıyla yapılandırılan davranış geçerlilik kazanır.

Daha fazla bilgi

Samuel Zeller'in hero resmi.