Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-19.01

Application cache ve invalidation

İlk public note okumasında store’a gidilir, sonraki okumada cache kopyası kullanılır. Miss, hata ve eski revision durumlarını ayrı izle.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Miss, sonra hit

  1. Public note isteniyor

    Application, public Tea note’u okumak ister. Bu örnekte application, cache kopyası ve asıl note store aynı process içinde yerel bileşenlerdir; henüz store read veya cache fill yapılmadı.

    Uygulama
    Public note okuması
    Yerel cache
    Cache sonucu yok
    Asıl store
    Asıl kayıt: Tea note / version=1
    Sonuç kararı
    Sonuç yok
  2. Cache’te kayıt yok

    Local entry bulunmaz. Bu miss, note’un asıl store’da da bulunmadığını söylemez.

    Uygulama
    Public note okuması
    Yerel cache
    Miss / cache kopyası yok
    Asıl store
    Asıl kayıt: Tea note / version=1
    Sonuç kararı
    Sonuç yok
  3. Store’dan oku

    Store title ve version=1 döndürür; readCount=1 olur. Sayaç okuma sayısını gösterir, latency ölçmez.

    Uygulama
    Public note okuması
    Yerel cache
    Miss / cache kopyası yok
    Asıl store
    Tea note / version=1 / readCount=1
    Sonuç kararı
    Sonuç yok
  4. Cache kopyası oluştur

    Public note’un ayrı kopyası cache’e konur. Application’a verilen object sonradan değişse bile saklanan cache kopyası değişmez; applicationMutationChangesCache=false bunu gözler.

    Uygulama
    Public note okuması
    Yerel cache
    Cache kopyası: Tea note / version=1
    Asıl store
    Tea note / version=1 / readCount=1
    Sonuç kararı
    Sonuç yok
  5. İlk sonuç hazır

    İlk miss sonrasında store’dan okunan note kullanılır. Bu adım uygulama sonucudur; browser’a HTTP teslimi gösterilmez.

    Uygulama
    Public note okuması
    Yerel cache
    Cache kopyası: Tea note / version=1
    Asıl store
    Tea note / version=1 / readCount=1
    Sonuç kararı
    İlk sonuç: Tea note / version=1
  6. Sonraki okumada hit

    Sonraki read cache kopyasını bulur; store readCount=1 kalır. Cache hit, en yeni store state’ini bildiğimizi tek başına garanti etmez.

    Uygulama
    Public note okuması
    Yerel cache
    Hit: Tea note / version=1
    Asıl store
    Tea note / version=1 / readCount=1
    Sonuç kararı
    İlk sonuç: Tea note / version=1
  7. Kopya yeniden kullanıldı

    Public note sonucu cache hit üzerinden sağlanır. Sahne hangi kopyanın kullanıldığını gösterir; production performansı ölçmez.

    Uygulama
    Public note okuması
    Yerel cache
    Hit: Tea note / version=1
    Asıl store
    Tea note / version=1 / readCount=1
    Sonuç kararı
    Yeniden kullanılan: Tea note / version=1

Late old fill

  1. Public note isteniyor

    Uygulama public note okumak ister. Local cache bir kopyadır; doğru verinin sorumlusu ayrı store’dur.

    Uygulama
    Public note okuması
    Yerel cache
    Cache sonucu yok
    Asıl store
    Asıl kayıt: Tea note / version=1
    Sonuç kararı
    Sonuç yok
  2. Eski aday bekliyor

    Reader version=1 adayını hazırlamıştır. Cache’e yazma henüz tamamlanmamıştır.

    Uygulama
    Fill bekliyor: Tea note / v1
    Yerel cache
    Cache sonucu yok
    Asıl store
    Asıl kayıt: Tea note / version=1
    Sonuç kararı
    Sonuç yok
  3. Store’da yeni revision

    Store Coffee note ve version=2 kaydını commit eder. Bekleyen eski aday kendiliğinden güncellenmez.

    Uygulama
    Fill bekliyor: Tea note / v1
    Yerel cache
    Cache sonucu yok
    Asıl store
    Asıl kayıt: Coffee note / version=2
    Sonuç kararı
    Sonuç yok
  4. Eski kopyayı geçersiz kıl

    Current revision=2 bilgisiyle cache entry geçersiz kılınır. Başka process’lerdeki kopyaların da eşzamanlı güncellendiği varsayılmaz.

    Uygulama
    Fill bekliyor: Tea note / v1
    Yerel cache
    Cache boş / bilinen revision=2
    Asıl store
    Asıl kayıt: Coffee note / version=2
    Sonuç kararı
    Sonuç yok
  5. Eski aday fill sınırında

    Version=1 adayı cache’e yazılmak üzeredir; store’un current revision değeri artık 2’dir.

    Uygulama
    Candidate=1 / current=2
    Yerel cache
    Cache boş / bilinen revision=2
    Asıl store
    Asıl kayıt: Coffee note / version=2
    Sonuç kararı
    Sonuç yok
  6. Eski fill reddedildi

    Aynı karar sınırındaki revision kontrolü eşleşmez; fill reddedilir ve cache boş kalır. Bu yerel kontrol distributed synchronization garantisi değildir.

    Uygulama
    Candidate=1 / current=2
    Yerel cache
    Candidate=1 reddedildi / cache boş
    Asıl store
    Asıl kayıt: Coffee note / version=2
    Sonuç kararı
    Sonuç yok
  7. Current veriyi yeniden oku

    Yeni store read version=2 alır. Reddedilen eski aday yerine committed veri seçilir.

    Uygulama
    Candidate=1 / current=2
    Yerel cache
    Candidate=1 reddedildi / cache boş
    Asıl store
    Current sonuç: Coffee note / version=2
    Sonuç kararı
    Sonuç yok
  8. Güncel sonuç hazır

    Uygulama version=2 sonucunu kullanır. Sonuç bu örnekteki yerel cache ve store kararlarına dayanır.

    Uygulama
    Candidate=1 / current=2
    Yerel cache
    Candidate=1 reddedildi / cache boş
    Asıl store
    Current sonuç: Coffee note / version=2
    Sonuç kararı
    Coffee note / version=2

Cache error

  1. Public note isteniyor

    Uygulama public note okumak ister. Local cache bir kopyadır; doğru verinin sorumlusu ayrı store’dur.

    Uygulama
    Public note okuması
    Yerel cache
    Cache sonucu yok
    Asıl store
    Asıl kayıt: Tea note / version=1
    Sonuç kararı
    Sonuç yok
  2. Cache kullanılamıyor

    Cache hata verir. Bu sonuç miss değildir; store’da note bulunmadığı anlamına da gelmez.

    Uygulama
    Public note okuması
    Yerel cache
    Hata / cache sonucu yok
    Asıl store
    Asıl kayıt: Tea note / version=1
    Sonuç kararı
    Sonuç yok
  3. Tanımlı fallback uygulanıyor

    Public read policy’si store’dan doğrudan okumayı seçer. Her operation için aynı fallback’in uygun olduğu varsayılmaz.

    Uygulama
    Public note okuması
    Yerel cache
    Hata / cache sonucu yok
    Asıl store
    Fallback: Tea note / version=1
    Sonuç kararı
    Sonuç yok
  4. Cache’e yazılamadı

    Cache hâlâ kullanılamadığı için yeni entry yazıldığı söylenmez. Store’dan alınan sonuç kopyası korunur.

    Uygulama
    Public note okuması
    Yerel cache
    Kullanılamıyor / entry yazılmadı
    Asıl store
    Fallback: Tea note / version=1
    Sonuç kararı
    Sonuç yok
  5. Store sonucu kullanıldı

    Uygulama store’dan gelen public sonucu kullanır. Store da hata verseydi bunu boş veya default note’a çevirmeyecekti.

    Uygulama
    Public note okuması
    Yerel cache
    Kullanılamıyor / entry yazılmadı
    Asıl store
    Fallback: Tea note / version=1
    Sonuç kararı
    Tea note / version=1 / source=store

ROLLER · STATE · VERİ AKIŞI

Cache hangi işi tekrar etmez?

Application cache, daha önce hesaplanan veya başka bir owner’dan okunan sonucu yeniden kullanır. Atlas public Tea note’u ilk kez isterken cache miss olur: application, authoritative note store’dan version=1 ve title alanını okur, bu representation’ın kopyasını cache’e koyar ve sonucu kullanır. Sonraki hit aynı key için saklanan değeri döndürür; store’a ikinci read yapılmaz. Örnekte bu fark read counter ile görünür. Daha az read yapılması latency’nin ölçüldüğü veya her workload’un hızlandığı anlamına gelmez. Cache’e raw object, query result veya computed view konabilir; bunların kapsamı aynı değildir.

Bu katman browser HTTP cache’inden ayrıdır. Application’ın process-local dictionary’si her instance için ayrı bir kopya oluşturabilir. Redis gibi network üzerinden erişilen bir store ise shared cache owner olabilir. Shared olması bütün application-side kopyaların aynı anda güncellendiği anlamına gelmez; memory kullanımı da kendiliğinden persistence garantisi değildir. Redis server-assisted client-side caching, client belleğindeki kopyalar için invalidation notification kullanabilir. Bu dersin yerel örneği tek process içindedir; o network protocol’ünü çalıştırmaz.

Hit, seçilen key için saklanmış bir sonuç bulunduğunu söyler. Sonucun authoritative owner’daki en yeni revision olduğunu söylemez. Miss, database’de not bulunmadığını söylemez; authoritative read gerekir. Error ise cache’e erişimin başarısız olmasıdır. Bu üç sonucu aynı “veri yok” durumuna çevirmek yanlış karar doğurur. Atlas’ın public-read örneği cache error sırasında authoritative store’a başvurur. Store da unavailable ise error devam eder; uygulama boş bir not üretmez. Bu fallback politikası sensitive veya state-changing operation’lara otomatik taşınmaz.

Invalidation hangi revision’ı korur?

Cache-aside write akışında önce authoritative update commit edilir, sonra ilgili cache entry invalidate edilir. Invalidate önce yapılırsa aradaki reader eski committed değeri yeniden cache’e doldurabilir. Doğru sıra da her topology için tam consistency garantisi değildir: başka writer, geciken read veya başka instance’ın local cache’i eski representation’ı geri getirebilir. TTL, eski değerin kullanılabileceği süreyi sınırlayabilir; expiry’den önce her read’in newest state’i alacağını garanti etmez.

Atlas’ın geç fill dalında reader version=1 için candidate hazırlamıştır. Owner daha sonra version=2’ye commit olur ve cache entry silinir. Eski candidate ancak bundan sonra değerlendirilir. Örneğin serialized guard’ı candidateVersion=1 ile knownCurrentVersion=2’yi karşılaştırır ve fill’i reddeder. Cache boş kalır; sonraki fresh read version=2’yi getirir. Bu guard’ın dayanağı aynı sınır içinde güncel revision’ın bilinmesidir. Dağıtık notification, bağımsız writer veya farklı cache owner için bu varsayımı ayrıca tasarlamak gerekir.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

Eski fill

  1. Eski read henüz bitmedi

    Reader, Tea note için version=1 sonucunu hazırlamış. Henüz cache’e yazılmamış bu kopya, daha sonra owner değişse bile kendi başına güncellenmez.

    Bekleyen reader
    candidateVersion=1
    Authoritative note sahibi
    Tea note / version=1
    Cache kabul sınırı
    Fill bekliyor
  2. Owner yeni revision’ı kaydetti

    Authoritative kayıt artık Coffee note, version=2. Bekleyen reader hâlâ eski kopyayı taşıyor; bir owner’ın commit’i başka bir state’i otomatik değiştirmiyor.

    Bekleyen reader
    candidateVersion=1
    Authoritative note sahibi
    Coffee note / version=2
    Cache kabul sınırı
    Fill bekliyor
  3. Cache boşaldı, eski aday kalıyor

    Invalidation cached entry’yi kaldırdı. Bu örnekte kabul sınırı güncel owner revision=2 bilgisini tutuyor. Cache’in boş olması, bekleyen bütün read’lerin taze olduğu anlamına gelmez.

    Bekleyen reader
    candidateVersion=1
    Authoritative note sahibi
    Coffee note / version=2
    Cache kabul sınırı
    knownCurrentVersion=2 / cache empty
  4. İki revision’ı aynı kararda karşılaştır

    Eski adayın version=1 değeri, kabul sınırındaki currentVersion=2 ile eşleşmiyor. Karar, geldiği anda adayın taşıdığı revision’a göre veriliyor.

    Bekleyen reader
    candidateVersion=1
    Authoritative note sahibi
    Coffee note / version=2
    Cache kabul sınırı
    1 != 2 / fill decision pending
  5. Eski kopya kabul edilmedi

    accepted=false ile eski fill cache’i değiştirmiyor; cache boş kalıyor. Bu guard yalnız güncel revision’ın aynı serialized owner sınırında bilindiği örnek için geçerli.

    Bekleyen reader
    candidateVersion=1 / rejected
    Authoritative note sahibi
    Coffee note / version=2
    Cache kabul sınırı
    accepted=false / cache empty
  6. Yeni read güncel owner’a dönüyor

    Sonraki read’in sonucu version=2. Eski fill’in reddedilmesi ile yeni sonucun alınması ayrı gözlemler. Başka process’lerdeki kopyaların eşzamanlı güncellendiği buradan çıkarılamaz.

    Bekleyen reader
    nextResultVersion=2
    Authoritative note sahibi
    Coffee note / version=2
    Cache kabul sınırı
    old fill accepted=false

Owner da yok

  1. Public read bir sonuç bekliyor

    Application public note’u okumak istiyor. Cache kopyası ile authoritative kayıt farklı owner’larda; sonucu hangi owner’ın sağlayacağı henüz bilinmiyor.

    Bekleyen reader
    Public note sonucu bekleniyor
    Authoritative note sahibi
    Henüz okunmadı
    Cache kabul sınırı
    Cache sonucu bekleniyor
  2. Cache erişimi hata verdi

    Cache outcome=error, miss ile aynı sonuç değil. Bu public read için seçilmiş policy, kaydı authoritative owner’dan okumayı deneyecek.

    Bekleyen reader
    Fallback kararı bekleniyor
    Authoritative note sahibi
    Henüz okunmadı
    Cache kabul sınırı
    cacheOutcome=error
  3. Fallback sahibi açık

    Application’ın fallback hedefi authoritative store. Başarısız cache’ten uydurma bir not üretmek yerine kaydın sahibine gidiliyor.

    Bekleyen reader
    fallbackOwner=authoritative store
    Authoritative note sahibi
    Read sonucu bekleniyor
    Cache kabul sınırı
    cacheOutcome=error
  4. Authoritative read de başarısız

    İkinci owner da unavailable olduğunda elde doğrulanmış note sonucu yok. Cache hatasını veri yokluğu olarak yorumlamak bu eksikliği çözmez.

    Bekleyen reader
    Başarı sonucu yok
    Authoritative note sahibi
    Store unavailable
    Cache kabul sınırı
    cacheOutcome=error
  5. Default not oluşturulmuyor

    bothUnavailable.result=error ve createdDefaultNote=false. Application, tamamlanamayan read’i yeni bir boş record varmış gibi göstermiyor.

    Bekleyen reader
    result=error / createdDefaultNote=false
    Authoritative note sahibi
    Store unavailable
    Cache kabul sınırı
    cacheOutcome=error
  6. Policy’nin kapsamını koru

    Bu karar public, read-only not örneğine ait. Aynı fallback’ın private veri veya state değiştiren bütün işlemler için uygun olduğunu söylemek ayrıca policy kanıtı gerektirir.

    Bekleyen reader
    result=error / no default
    Authoritative note sahibi
    Authoritative sonuç alınamadı
    Cache kabul sınırı
    Public okuma politikası

VARSAYIM · SINIR · KONTROL

Hit ile freshness farklı iddialardır

Cache incelemesinde yalnız hit ratio’ya bakma. Artifact cache revision’ını ve authoritative revision’ı ayrı tutar; eski bir kopya hâlâ hit olabilir. Öğrencinin sorusu “entry var mı?”dan sonra “hangi representation, hangi revision ve ne kadar staleness kabul ediliyor?” olmalıdır. Eski computed view ile alınan karar yanlış olabilir. TTL’yi current permission veya newest state kontrolünün yerine koymak bu sınırı kaybettirir.

Bir instance’ın cache entry’sini silmek diğer instance’ın kopyasını güncellemez. Shared cache’in temizlenmesi de bütün client-side kopyaların yenilendiğini kanıtlamaz. Buradaki yanlış varsayım, bir owner’ın tamamlanmasını bütün owner’ların synchronized olmasıyla eşitlemektir. Atlas yalnız public note revision’larını izler; etkiyi bu representation’ın eski kalması üzerinden değerlendirir.

Error’ı database absence’a çevirme

Cache unavailable olduğunda get işlemi error verir; miss üretmiş sayılmaz. Public-read fallback store’dan sonuç alabilirse application o owner’ın representation’ını kullanır. Cache population’ın başarısız kalması bu store sonucunu yok etmez. Store da unavailable olduğunda boş not üretmek ise bilinmeyen bir durumu uydurma bir record’a dönüştürür. Fallback’in kaynak tüketimi ve retry davranışı kendi policy’sine göre ayrıca değerlendirilmelidir.

Geç fill dalında eski candidate ile güncel owner revision’ı uyuşmaz ve guard state’i değiştirmez. İnceleme, candidate’ın hangi revision’a ait olduğunu ve karar sırasında current revision’ın nereden bilindiğini sorar. Artifact’te karar alanı eksikse selector sonucunun sıfır olması yeterli değildir: bu sayı bazen eşleşen olay olmadığı, bazen gerekli observation bulunmadığı için sıfırdır. Eksik gözlemden “cache güncel” sonucu çıkarma.

3. Blue · Güvenli geliştirme ve savunma

Hareket olmadan bütün senaryoları oku

Fallback sonucu

  1. Alanları owner’a göre ayır

    Buradaki kanıtın üreticisi yerel cache adapter’ı ve note store okumasıdır; error, returnedVersion ve readCount bu örneğin alanlarıdır, hazır Redis log alanları değildir. İnceleme error bölümünü kullanıyor. Cache outcome, fallback owner, returned version ve population sonucu aynı şeyin farklı adları değil; her biri ayrı bir soruya cevap veriyor.

    Cache gözlemi
    error / seçilmiş alanlar
    Sonuç kaynağı
    Sonuç kaynağı henüz okunmadı
    Kanıt yorumu
    Yorum bekliyor
  2. Error ile miss’i ayır

    cacheOutcome=error, cache erişiminin tamamlanamadığını gösteriyor. Kayıt cache’te yokmuş gibi bir miss saymak, hangi bileşenin başarısız olduğunu gizler.

    Cache gözlemi
    cacheOutcome=error
    Sonuç kaynağı
    Sonuç kaynağı henüz okunmadı
    Kanıt yorumu
    Cache hatası; kayıt yokluğu değil
  3. Fallback owner’ı oku

    fallbackOwner=authoritative store. Sonuç başarılıysa bunun kaynağı cache değil, kaydın authoritative sahibi olacak.

    Cache gözlemi
    cacheOutcome=error
    Sonuç kaynağı
    fallbackOwner=authoritative store
    Kanıt yorumu
    Result version bekleniyor
  4. Dönen revision ayrı kanıt

    returnedVersion=1 bu read’in sonucunu tanımlar. Tek başına bu sayı cache’in yeniden dolduğunu veya farklı process’lerdeki kopyaların yenilendiğini göstermez.

    Cache gözlemi
    cacheOutcome=error
    Sonuç kaynağı
    returnedVersion=1 / source=store
    Kanıt yorumu
    Owner sonucu var; cache sonucu ayrı
  5. Population başarılı değil

    cachePopulationSucceeded=false kalıyor. Application doğru owner’dan bir not döndürebilirken cache hâlâ kullanılamıyor; iki başarı kriterini birleştirme.

    Cache gözlemi
    cachePopulationSucceeded=false
    Sonuç kaynağı
    returnedVersion=1 / source=store
    Kanıt yorumu
    Read success != cache recovery
  6. Desteklenen iddiayı seç

    Bu kayıt, public read sonucunun authoritative store’dan geldiğini destekliyor. Cache recovery, latency kazancı veya bütün outage koşullarında resilience için burada kanıt yok.

    Cache gözlemi
    cacheOutcome=error / population=false
    Sonuç kaynağı
    returnedVersion=1 / source=store
    Kanıt yorumu
    Public read fallback doğrulandı

Eksik gözlem

  1. Stale-fill kaydını seç

    Buradaki kanıtın üreticisi yerel cache adapter’ı ve note store okumasıdır; error, returnedVersion ve readCount bu örneğin alanlarıdır, hazır Redis log alanları değildir. Öğretim kaydında candidateVersion ile currentVersion karşılaştırılır. Kabul kararı için fillAccepted alanının da bulunması gerekir.

    Cache gözlemi
    candidateVersion=1 / currentVersion=2
    Sonuç kaynağı
    fillAccepted henüz okunmadı
    Kanıt yorumu
    Kabul sonucu bilinmiyor
  2. Bu örnekte kabul alanı eksik

    Eksik gözlem dalında fillAccepted verilmemiş. Bu alanı false olarak doldurmak, mevcut kanıtı öğrencinin varsayımıyla tamamlamak olur.

    Cache gözlemi
    candidateVersion=1 / currentVersion=2
    Sonuç kaynağı
    fillAccepted=unknown
    Kanıt yorumu
    Kabul sonucu bilinmiyor
  3. Selector yalnız gördüğünü sayar

    Stale revision’ın kabul edildiğini arayan selector eşleşme bulmayabilir. Ancak kabul alanı eksik olduğunda sıfır eşleşme, reject kararı için kanıt değildir.

    Cache gözlemi
    candidateVersion=1 / currentVersion=2
    Sonuç kaynağı
    fillAccepted=unknown / no matching record
    Kanıt yorumu
    Zero matches != proven reject
  4. Gerekli ek gözlemi belirle

    Aynı fill denemesi için kabul sonucunu ve hangi güncel owner revision’ına göre karar verildiğini iste. Başka bir fill’in sonucu bu denemeyi tamamlamaz.

    Cache gözlemi
    candidateVersion=1 / currentVersion=2
    Sonuç kaynağı
    Aynı fill için karar eksik
    Kanıt yorumu
    Aynı attempt için kabul kanıtı gerekir
  5. Bilinen tam örnekle farkı gör

    Tam lateFill kaydında accepted=false ve cacheEmptyAfterReject=true birlikte bulunur. Bu tam kaydın sonucu, eksik dalda aynı olay gözlenmiş gibi kopyalanamaz.

    Cache gözlemi
    candidateVersion=1 / currentVersion=2
    Sonuç kaynağı
    complete example: accepted=false
    Kanıt yorumu
    Eksik dalın sonucu bilinmiyor
  6. Belirsizliği sonuçta koru

    Eksik dal için sonuç “yetersiz kanıt”. Bu, cache’in hatalı çalıştığını da doğru çalıştığını da kanıtlamıyor. İnceleme alanın eksikliğini açık tutuyor.

    Cache gözlemi
    candidateVersion=1 / currentVersion=2
    Sonuç kaynağı
    fillAccepted=unknown
    Kanıt yorumu
    Yetersiz kanıt

UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA

Cache contract’ı gözlenebilir olsun

Buradaki kanıtın üreticisi yerel cache adapter’ı ve note store okumasıdır; error, returnedVersion ve readCount bu örneğin alanlarıdır, hazır Redis log alanları değildir. Cache key’in hangi representation ve revision’ı tanımladığını açıkça yaz. Application’a verilen object’in cache içinde saklanan object ile aynı mutable referans olması istenmiyorsa kopyalama sınırını da tanımla. Atlas’ın ilk miss’i authoritative readCount’u artırır; sonraki hit artırmaz. Bu sayaç seçilen adapter’ın read sayısıdır, Redis statistics veya latency ölçümü değildir. Cache’in authoritative record owner olmadığı ayrımı korunur.

Cache error ile store error için ayrı outcome kaydet. Public-read fallback’te result’un hangi owner’dan geldiği görünür olmalıdır; store failure sırasında default object üretilmemelidir. Result contract’ı gerçek uygulamada purpose, permission ve kabul edilen staleness koşullarını da taşır. Browser için HTTP Cache-Control tanımlamak bu server-side dictionary’yi kendiliğinden invalidate etmez; iki cache katmanının policy’si ayrıdır.

Commit, invalidate ve refill’i ayrı izle

Normal update’de store version=2’ye commit olur, invalidate entry’yi kaldırır ve sonraki read yeni revision’ı cache’e doldurur. Her adım kendi owner state’ini değiştirir; başarılı invalidation cross-owner atomic transaction değildir. Geç candidateVersion=1 reddedildiğinde cache boş kalır. Fresh read’den sonra version=2 görülür. Son değere bakmakla yetinmeyip bu geçişlerin sırasını ve decision alanlarını da incele.

Revision guard ancak kararın alındığı sınırda current revision güvenilir biçimde biliniyorsa anlamlıdır. Farklı process’ler, geciken notification’lar ve bağımsız writer’lar bu koşulu değiştirebilir. Atlas’ın yerel guard’ı bunları çözmüş sayılmaz. Eksik decision kaydı UNKNOWN olarak kalır; aynı sonuca ulaşmış başka request’in observation’ı bu request’in boşluğunu doldurmaz.

ŞİMDİ VAKAYA UYGULA

Cache boşaltıldıktan sonra gelen eski read sonucu hangi revision’ı taşıyor?

Duru, Atlas’taki public Tea note kaydını okuyor. Kayıt sahibi başlığı Coffee note olarak güncellerken daha önce başlamış bir read hâlâ version=1 taşıyor. Cache’in boşaltılması bu bekleyen kopyayı kendiliğinden yenilemez.

Vakadaki representation hangi cache owner’dan geliyor? Key kapsamı, freshness ve kullanıcının context’ini birlikte değerlendir; hit olması doğru viewer’a ait olduğunu kanıtlamaz.

Bağlı vaka dosyasını aç ↗

ÖRNEĞİ BİRLİKTE OKUYALIM

Public note cache/revision ledger

Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.

Ham kaydı ve alan açıklamalarını oku
{
  "selectedPolicy": {
    "cache": "own process-local copy dictionary",
    "authoritativeStore": "own public-note memory adapter",
    "redisExecuted": false,
    "httpCache": false,
    "errorFallback": "authoritative read for public read only",
    "revisionGuard": "serialized known owner revision; not distributed guarantee"
  },
  "normal": {
    "firstResult": {
      "id": "tea",
      "title": "Tea note",
      "version": 1
    },
    "firstCacheOutcome": "miss",
    "storeReadsAfterFirst": 1,
    "secondCacheOutcome": "hit",
    "storeReadsAfterSecond": 1,
    "applicationMutationChangesCache": false
  },
  "update": {
    "committedValue": {
      "id": "tea",
      "title": "Coffee note",
      "version": 2
    },
    "order": [
      "store commit",
      "cache invalidate",
      "next read/refill"
    ],
    "cacheEmptyAfterInvalidate": true,
    "refillVersion": 2
  },
  "lateFill": {
    "candidateVersion": 1,
    "knownCurrentVersion": 2,
    "accepted": false,
    "cacheEmptyAfterReject": true,
    "nextResultVersion": 2
  },
  "error": {
    "cacheOutcome": "error",
    "fallbackOwner": "authoritative store",
    "returnedVersion": 1,
    "cachePopulationSucceeded": false
  },
  "bothUnavailable": {
    "result": "error",
    "createdDefaultNote": false
  },
  "selector": {
    "language": "XPath",
    "xml": "<audit><cache candidateVersion=\"1\" currentVersion=\"2\" fillAccepted=\"false\"/></audit>",
    "xpath": "count(/audit/cache[@candidateVersion != @currentVersion and @fillAccepted='true'])",
    "expected": 0,
    "positiveFixtureXml": "<audit><cache candidateVersion=\"1\" currentVersion=\"2\" fillAccepted=\"true\"/></audit>",
    "positiveExpected": 1,
    "scope": "Only authored protocol-decision observations, not product log field names or a live HTTP capture.",
    "missingFieldBehavior": "Missing observation is insufficient evidence; zero matches is not proof of correct runtime behavior."
  }
}
normal
Miss/hit’in authoritative read count’u.
update/lateFill
Commit/invalidate/refill ve serialized version guard.
error/bothUnavailable
Error fallback owner ve default state yokluğu.
selector
Synthetic stale-fill acceptance kararı.

Own local memory adapters; gerçek Redis/ElastiCache veya latency/cluster ölçümü değildir. Guard’ın current-owner varsayımı açıktır.

İki yanlış kanı

Cache hit en güncel authoritative state’i kanıtlar.

Hit cached result bulur; freshness ayrı lifetime/invalidation/consistency contract’ına bağlıdır.

Invalidate ettim; geç kalan eski read cache’e tekrar yazamaz.

Selected concurrency sequence eski fill’i getirebilir; local condition’ın revision owner scope’u açık olmalıdır.

SIRA SENDE

Bu hikâyeyi sen çöz.

Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.

Bilinen güncel version=2, fakat geciken cache fill version=1 getiriyor. Bu sonuç cache’e kabul edilir mi?

  1. Hayır. cacheEmptyAfterReject=true; sonraki read version=2 döndürür.
  2. Evet. Son tamamlanan fill her zaman cache’in üzerine yazmalıdır.
Gerekçeli cevabı oku

Hayır. cacheEmptyAfterReject=true; sonraki read version=2 döndürür. — Bu yerel modelde revision kontrolü, eski adayın daha yeni kaydı gölgelemesini engeller. Reddedilen fill sonrasında cache boş kalır.

Cache hatasında public-read fallback ile hem cache hem store erişilemezken verilen sonuç neden farklıdır?

Dersten seçilen artifact alanları; öğretim örneği

error
{"cacheOutcome":"error","fallbackOwner":"authoritative store","returnedVersion":1,"cachePopulationSucceeded":false}
bothUnavailable
{"result":"error","createdDefaultNote":false}
  1. Her cache hatası miss sayılır ve varsayılan resource oluşturulur.
  2. Cache hatasında store’dan okunabilir; ikisi de erişilemezse hata döner.
Gerekçeli cevabı oku

Cache hatasında store’dan okunabilir; ikisi de erişilemezse hata döner. — Bu public-read policy’si, cache hatasında authoritative store’a başvurabilir. Store’un durumu da bilinmiyorsa veri uydurmaz veya varsayılan note oluşturmaz.

Store commit → cache invalidate → refill sırası neden bütün node’larda invalidation garantisi değildir?

Gerekçeli cevabı oku

Bu örnekte yerel dictionary, authoritative store write işleminden sonra invalidate edilir. Sonraki read version=2 ile cache’i yeniden doldurur. Revision kontrolü, aynı owner’ın sırayla işlediği bilinen state’i kullanır; node’lar arasındaki invalidation delivery veya replication ölçülmez. Bu application cache, browser HTTP cache’i değildir; Redis de çalıştırılmamıştır (RedisExecuted=false).

□ Yerel revision kontrolünden distributed garanti çıkarmadım.

□ Application cache ile HTTP cache’i ayrı açıkladım.

Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç

Kaynaklar ve kapsam