İçeriğe geç

CDN ve Kenar Önbellek — Kampanya Sayfası Hızlansın, Hesap Sayfası Karışmasın

Orta 9 dk Sık karşılaşılır

Önce şunu oku: Tarayıcı Önbelleği — Yeni Sürümü Yayına Aldın, Müşteri Neden Hâlâ Eskisini Görüyor?

30 saniyede özet

CDN, sayfaların kopyasını kullanıcılara yakın kenar sunucularda tutar. Herkese açık sayfalar orada hızlanır; kişisel bir sayfa oraya girerse müşteri başkasının hesabını görür. Kişisel olanı önbelleğe alma, yayında eskiyi temizle.

Gazeteyi matbaadan değil, mahalledeki bayiden alırsın; bayi her sabah birkaç kopya tutar. Ama sana gelen kişisel bir mektup bayide bekletilmez. Bekletilirse, onu ilk soran kişi alır.

  1. Bayt: Siteyi CDN arkasına aldık ve her şeyi bir saat önbelleğe koyduk. Sayfalar uçuyor!

  2. Sen: Bora 'Hesabım'ı açmış ve Ayşe'nin bakiyesini görmüş.

  3. Bayt: Ama /hesabim sayfası her kullanıcıya kendi bilgisini gösteriyor!

  4. Bayt: Gösteriyor. Ama kenar sunucu bunu bilmiyor; ona göre /hesabim tek bir sayfa.

Kenar sunucu ne yapar?

Bir CDNİçerik dağıtım ağı: cevapların kopyasını kullanıcılara yakın kenar sunucularda tutar. Herkese açık sayfalar ana sunucuya gitmeden gelir.Sözlükte gör →, cevapların kopyasını kullanıcılara yakın kenar sunucularda tutar. Aynı sayfayı isteyen ikinci kullanıcı, ana sunucuya gitmeden cevap alır.

Neyin ne kadar süre tutulacağını ana sunucunun gönderdiği Cache-ControlSunucunun bir cevapla gönderdiği başlık: tarayıcının bu cevabı saklayıp saklamayacağını ve ne kadar süre sormadan kullanacağını söyler.Sözlükte gör → başlığı söyler. public, max-age=3600, “bunu bir saat boyunca herkese verebilirsin” demektir.

Kafam karıştı, daha basit anlat

CDN, sayfaların kopyasını kullanıcıya yakın tutar. Ne kadar süre tutacağını Cache-Control başlığı söyler.

Hızlı kontrolBaşlangıç

CDN ne yapar?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Cache-Control: public, max-age=3600 kenar sunucuya ne söyler?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kişisel olan kenara girmez

Her cevap 'public, max-age=3600' ile gönderiliyor. Ayşe /hesabim sayfasını açtı. Bir dakika sonra Bora aynı kenar sunucudan /hesabim istedi. Bora ne görür? Cevabı göster

Ayşe’nin hesap sayfasını. Kenar sunucu için /hesabim tek bir adres, tek bir kopya. Ayşe’nin cevabı public olarak saklandı ve sonraki herkese verildi.

Gazete bayide, mektup elden, eski baskı toplanır.
Adım adım oku
  1. Matbaa uzakta, bayi mahallede.
  2. Bayi Ayşe'nin mektubunu Bora'ya verdi.
  3. Yeni baskı çıktı, bayide eskisi duruyor.
  4. Gazete bayide, mektup elden, eski baskı toplanır.

Kişiye özel cevaplar private, no-store ile gönderilir: kenar sunucu onları hiç saklamaz, her istek ana sunucuya gider. Kampanya sayfası gibi herkese açık olanlar ise public kalır.

Herkese açık sayfa değişince kenar sunucular eski kopyayı süresi dolana kadar vermeye devam eder. Yayında önbellek temizlemeKenar sunuculardaki bir sayfanın kopyasını süresi dolmadan silme isteği. Yayından sonra eski sürümün dağıtılmasını önler.Sözlükte gör → isteği gönderirsen, bir sonraki istek yeni sürümü getirir.

Kafam karıştı, daha basit anlat

Kişisel sayfa private ve no-store. Herkese açık sayfa public, ve yayında temizlenir.

Hızlı kontrolOrta

Kişiye özel bir sayfa public olarak önbelleğe alınırsa ne olur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kişiye özel bir cevap için hangi başlık uygundur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

İki kenar sunucu, sekiz istek, bir yayın

Tohum 293558
  1. Ayşe (İzmir) /kampanyalar
  2. Bora (İzmir) /kampanyalar
  3. Ayşe (İzmir) /hesabim
  4. Bora (İzmir) /hesabim
  5. Cem (Ankara) /kampanyalar
  6. — yayın: kampanya sayfası değişti —
    Bora (İzmir) /kampanyalar
  7. Cem (Ankara) /kampanyalar
  8. Ayşe (İzmir) /kampanyalar

↗ ana sunucu: 0 · ✓ kenardan: 0 · ✕ sızıntı: 0 · ⚠ eski: 0

Hız
Adım 0

Şu an ne oldu?

CDN önbelleği yok

İzmir ve Ankara’da birer kenar sunucu var; ana sunucu tek.

Görevler0/3

  • Bir müşteri başka birinin hesap sayfasını görsünaçık

    İpucu

    Her şeyi public önbelleğe al.

  • Sızıntı olmasın, ama yayından sonra eski kampanya görünsünaçık

    İpucu

    Kişisel sayfaları ayır, temizlemeyi unut.

  • Sızıntı ve eski sürüm olmasın, en az iki istek kenardan gelsinaçık

    İpucu

    Ayır ve yayında temizle.

Olay günlüğü (0)

Henüz olay yok. Oynat veya adımla.

  1. Varsayılanla oynat. Her istek ana sunucuya gitti; değişmeyen kampanya sayfası bile.
  2. “Her cevap 1 saat public” seç. Bora, Ayşe’nin hesap sayfasını kenar sunucudan aldı.
  3. “Kişisel sayfalar private” seç. Sızıntı bitti, ama yayından sonra üç istek eski kampanyayı gördü.
  4. Temizlemeyi de aç. Yayından sonraki ilk istek yeni sürümü ana sunucudan aldı, sonraki kenardan geldi.
Hızlı kontrolOrta

Kampanya sayfası bir saat public. Yayında sayfa değişti ama temizleme yapılmadı. Ne olur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Önbellek temizlemeden (purge) sonraki ilk istek ne yapar?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Tuzaklar

Varsayılan kuralları körü körüne açmak. “Bütün HTML’i önbelleğe al” gibi bir CDN ayarı, oturum çerezine bakmadan kişisel sayfaları da saklayabilir. Kişisel sayfalar başlıklarıyla açıkça hariç tutulmalı.

Temizlemeyi unutmak. Yayın betiği, değişen herkese açık sayfalar için temizleme isteğini de göndermeli. Dosya adında içerik özeti olan dosyalar ise hiç temizlenmek zorunda değildir.

Önbelleği test etmemek. “Kişisel sayfa no-store mu?” sorusu bir testle kontrol edilmeli; bir başlık kaybolursa sızıntı sessizce başlar.

Kafam karıştı, daha basit anlat

Kişisel sayfaları açıkça hariç tut, yayında temizle, başlıkları testle koru.

Hızlı kontrolİleri

CDN'de 'bütün HTML'i önbelleğe al' ayarı neden tehlikelidir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.
Derinleş · İnternet şubesi: kampanya kenarda, hesap asla 4 dosya · ~71 satır · ilk okumada atlayabilirsin
Proje dosyaları

src/main/java/com/bank/web/ CampaignController.java Kampanya: herkese açık, bir saat public.

src/main/java/com/bank/web/CampaignController.java
@RestController
class CampaignController {
private final CampaignService campaigns;
CampaignController(CampaignService campaigns) {
this.campaigns = campaigns;
}
// Same page for everyone: an edge may keep it for an hour.
@GetMapping("/api/kampanyalar")
ResponseEntity<List<Campaign>> campaigns() {
return ResponseEntity.ok()
.cacheControl(CacheControl.maxAge(Duration.ofHours(1)).cachePublic())
.body(campaigns.active());
}
}

src/main/java/com/bank/web/ AccountController.java Hesap: kişiye özel, private ve no-store; kenar sunucu hiç saklamaz.

src/main/java/com/bank/web/AccountController.java
@RestController
class AccountController {
private final AccountService accounts;
AccountController(AccountService accounts) {
this.accounts = accounts;
}
// One customer's data: never stored by an edge or a shared cache.
@GetMapping("/api/hesabim")
ResponseEntity<AccountSummary> mine(@AuthenticationPrincipal BankUser user) {
return ResponseEntity.ok()
.cacheControl(CacheControl.noStore().cachePrivate())
.body(accounts.summaryFor(user.account()));
}
}

src/main/java/com/bank/web/ CampaignPurger.java Temizleme: kampanya yayınlanınca kenar sunuculardaki kopya silinir.

src/main/java/com/bank/web/CampaignPurger.java
@Component
class CampaignPurger {
private final RestClient cdn;
CampaignPurger(RestClient.Builder builder, @Value("${cdn.purge-url}") String purgeUrl) {
this.cdn = builder.baseUrl(purgeUrl).build();
}
// A new campaign is live: drop the old copy from every edge.
@EventListener
void on(CampaignPublished event) {
cdn.post()
.body(Map.of("paths", List.of("/api/kampanyalar")))
.retrieve()
.toBodilessEntity();
}
}

src/test/java/com/bank/web/ CacheHeadersTest.java Test: iki başlık da bir testle korunuyor; biri kaybolursa build kırılır.

src/test/java/com/bank/web/CacheHeadersTest.java
@SpringBootTest
@AutoConfigureMockMvc
class CacheHeadersTest {
@Autowired MockMvc mvc;
@Test
void campaignsArePublicForAnHour() throws Exception {
mvc.perform(get("/api/kampanyalar"))
.andExpect(header().string("Cache-Control", allOf(containsString("public"), containsString("max-age=3600"))));
}
@Test
@WithMockUser
void theAccountPageIsNeverStored() throws Exception {
mvc.perform(get("/api/hesabim"))
.andExpect(header().string("Cache-Control", allOf(containsString("no-store"), containsString("private"))));
}
}

Kendini sına

Şimşek turu1/4

Kenar sunucu, aynı adresi isteyen iki kullanıcının farklı kişiler olduğunu kendiliğinden bilir.

Soru 1/3İleri

Adında içerik özeti olan dosyaların (app.3f9a.js) yayında temizlenmesi gerekir mi?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aklında kalacak üç şey

  1. 1 CDN, cevapların kopyasını kullanıcıya yakın kenar sunucularda tutar. Herkese açık ve sık istenen sayfalar ana sunucuya gitmeden gelir.
  2. 2 Kenar sunucu için bir adres, bir sayfadır; kimin istediğini bilmez. Kişiye özel cevaplar private ya da no-store olmalı, yoksa bir müşteri başkasının sayfasını görür.
  3. 3 Uzun süre önbellekte tutulan sayfa, yayında temizlenmelidir. Temizlenmezse kenar sunucular eski sürümü süresi dolana kadar vermeye devam eder.
Sonraki kapı İstanbul bölgesi karardı. Frankfurt'taki kopya hemen devraldı. Ama son üç havale ortada yok. Nereye gittiler? Çok Bölgeli Kurulum — Bir Bölge Kararınca Banka Çalışmaya Devam Eder mi? · 8 dk

4 kart sonraki derste seni bekliyor

0/4 kart bu dersten toplandı