Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-18.03

NoSQL ve key-value stores

NoSQL ailesinin farklı storage modellerini ayır; public note’un key/value, version ve lifetime contract’ını seçilmiş local adapter üzerinde oku.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Value found

  1. Public read hazır

    Application, public:note:tea key’i için read hazırlar. Bu örneğin store’u yalnız kendi memory state’i için authoritative’tir; key prefix identity veya permission oluşturmaz.

    Application
    Public note read istendi
    Local adapter
    Sonuç yok
    Selected KV owner
    Stored JSON; örnek lifetime
    Result decision
    Application kararı yok
  2. Key mapping

    Adapter public:note:tea key’ini kullanır; public prefix store authorization veya value validation uygulamaz.

    Application
    Public note read istendi
    Local adapter
    Key selected: public:note:tea
    Selected KV owner
    Stored JSON; örnek lifetime
    Result decision
    Application kararı yok
  3. Lifetime kararı

    Seçilen logical clock=49, expiresAt=50’den küçüktür. Store value’yu bulur; bu lookup sonucu henüz application’ın JSON shape kararı değildir.

    Application
    Public note read istendi
    Local adapter
    Key selected: public:note:tea
    Selected KV owner
    Clock=49 < expiry=50; value bulundu
    Result decision
    Application kararı yok
  4. Lookup sonucu

    Adapter public:note:tea için found ve JSON string döndürür. Değer id=tea, title=Tea note, version=1 taşır; parse ve shape validation sonraki yerel adımdadır.

    Application
    Public note read istendi
    Local adapter
    JSON string bulundu
    Selected KV owner
    Clock=49 < expiry=50; value bulundu
    Result decision
    Application kararı yok
  5. Result işleme

    Application JSON string’i parse eder, id/title/version shape’ini doğrular ve bağımsız copy oluşturur. Bu copy’deki field değişikliği store’a write operation göndermez.

    Application
    Public note read istendi
    Local adapter
    JSON string bulundu
    Selected KV owner
    Clock=49 < expiry=50; value bulundu
    Result decision
    Parse edilmiş copy; shape geçerli
  6. Application kararı

    Application lookup sonucunu kullanır; bu local sonuç persistence, replica visibility veya permission kanıtı değildir.

    Application
    Tea note; version=1
    Local adapter
    JSON string bulundu
    Selected KV owner
    Clock=49 < expiry=50; value bulundu
    Result decision
    Parse edilmiş copy; shape geçerli

Lifetime ended

  1. Public read hazır

    Application, public:note:tea key’i için read hazırlar. Bu örneğin store’u yalnız kendi memory state’i için authoritative’tir; key prefix identity veya permission oluşturmaz.

    Application
    Public note read istendi
    Local adapter
    Sonuç yok
    Selected KV owner
    Stored JSON; örnek lifetime
    Result decision
    Application kararı yok
  2. Key mapping

    Adapter public:note:tea key’ini kullanır; public prefix store authorization veya value validation uygulamaz.

    Application
    Public note read istendi
    Local adapter
    Key selected: public:note:tea
    Selected KV owner
    Stored JSON; örnek lifetime
    Result decision
    Application kararı yok
  3. Lifetime kararı

    logical clock=50, expiresAt=50 sınırına ulaşır; bu profile equality missing üretir. Store lookup için value bırakmaz; application’a henüz missing sonucu dönmemiştir.

    Application
    Public note read istendi
    Local adapter
    Key selected: public:note:tea
    Selected KV owner
    Clock=50; expiry=50; missing
    Result decision
    Application kararı yok
  4. Lookup sonucu

    Adapter missing döndürür; bu öğretim kaydında fixtureReason=expired vardır. Genel ürün API’sinin her missing için bu nedeni bildiği varsayılmaz; JSON value yoktur.

    Application
    Public note read istendi
    Local adapter
    Missing; örnek reason=expired
    Selected KV owner
    Clock=50; expiry=50; missing
    Result decision
    Application kararı yok
  5. Result işleme

    Missing sonucunda parse edilecek note yoktur ve bu dal default note yaratmaz. Cache kullanılıyorsa başka authoritative owner’dan fallback read ayrı contract ister; bu sahne öyle bir read çalıştırmaz.

    Application
    Public note read istendi
    Local adapter
    Missing; örnek reason=expired
    Selected KV owner
    Clock=50; expiry=50; missing
    Result decision
    Parsed note yok; default yok
  6. Application kararı

    Application lookup sonucunu kullanır; bu local sonuç persistence, replica visibility veya permission kanıtı değildir.

    Application
    Missing alındı; note yok; fallback gösterilmez
    Local adapter
    Missing; örnek reason=expired
    Selected KV owner
    Clock=50; expiry=50; missing
    Result decision
    Parsed note yok; default yok

Stale revision

  1. Koşullu update hazır

    Application, public:note:tea için önceki read’den expectedVersion=1 taşır ve koşullu update ister. Bu eski beklenti store’un güncel version’ını kanıtlamaz; henüz update kabul edilmemiştir.

    Application
    Koşullu update hazır; expectedVersion=1
    Local adapter
    Sonuç yok
    Selected KV owner
    Stored JSON; örnek lifetime
    Result decision
    Application kararı yok
  2. Key mapping

    Adapter public:note:tea key’ini kullanır; public prefix store authorization veya value validation uygulamaz.

    Application
    Public note read istendi
    Local adapter
    Key selected: public:note:tea
    Selected KV owner
    Stored JSON; örnek lifetime
    Result decision
    Application kararı yok
  3. Yeni revision

    Araya giren update store’da id=tea, title=Coffee note, version=2 oluşturmuştur. Application expectedVersion=1 beklentisini korur; yeni owner state’ini eski read’den bildiği varsayılmaz.

    Application
    Expected version 1
    Local adapter
    Key selected: public:note:tea
    Selected KV owner
    Current Coffee note; version=2
    Result decision
    Application kararı yok
  4. Revision koşulu

    Owner aynı serialized karar içinde expectedVersion=1 ile currentVersion=2 değerlerini karşılaştırır. Mismatch vardır; bu local conditional update kararı distributed lock veya collection transaction değildir.

    Application
    Expected version 1
    Local adapter
    Expected=1; current=2 karşılaştırıldı
    Selected KV owner
    Current Coffee note; version=2
    Result decision
    Application kararı yok
  5. Stale update reddi

    Mismatch nedeniyle update uygulanmaz; afterValue Coffee note/version=2 olarak korunur. Bu son value ayrı read ile karşılaştırılabilir; ret cevabı tek başına bütün transaction’ın rollback edildiği anlamına gelmez.

    Application
    Expected version 1
    Local adapter
    Expected=1; current=2 karşılaştırıldı
    Selected KV owner
    Coffee note; version=2 korundu
    Result decision
    Application kararı yok
  6. Conflict sonucu

    Application stale update’in uygulanmadığını görür; local koşullu karar bütün transaction için rollback sonucu değildir.

    Application
    Update reddedildi; expectedVersion=1
    Local adapter
    Expected=1; current=2 karşılaştırıldı
    Selected KV owner
    Coffee note; version=2 korundu
    Result decision
    Conflict; overwrite yok

Store unavailable

  1. Public read hazır

    Application, public:note:tea key’i için read hazırlar. Bu örneğin store’u yalnız kendi memory state’i için authoritative’tir; key prefix identity veya permission oluşturmaz.

    Application
    Public note read istendi
    Local adapter
    Sonuç yok
    Selected KV owner
    Stored JSON; örnek lifetime
    Result decision
    Application kararı yok
  2. Key mapping

    Adapter public:note:tea key’ini kullanır; public prefix store authorization veya value validation uygulamaz.

    Application
    Public note read istendi
    Local adapter
    Key selected: public:note:tea
    Selected KV owner
    Stored JSON; örnek lifetime
    Result decision
    Application kararı yok
  3. Store unavailable

    Örneğin availability koşulu false olarak seçilmiştir; bundan note’un absent veya expired olduğu çıkarılmaz.

    Application
    Public note read istendi
    Local adapter
    Key selected: public:note:tea
    Selected KV owner
    Örnek availability=false
    Result decision
    Application kararı yok
  4. Error ayrı

    Adapter unavailable error verir; onu missing result’a dönüştüren fallback bu contract’ta yoktur.

    Application
    Public note read istendi
    Local adapter
    Error; value/missing sonucu yok
    Selected KV owner
    Örnek availability=false
    Result decision
    Application kararı yok
  5. Kararı durdur

    Application authoritative empty state veya default note üretmez; unavailable sonucu nedeniyle karar durur.

    Application
    Public note read istendi
    Local adapter
    Error; value/missing sonucu yok
    Selected KV owner
    Örnek availability=false
    Result decision
    Karar durdu; default yok

ROLLER · STATE · VERİ AKIŞI

NoSQL bir tek database davranışı değildir

NoSQL, relational tables dışındaki farklı data modellerini bir arada anmak için kullanılır; document ve key-value modelleri bu dersin iki örneğidir. Bir ürünün query dili, schema validation, transaction ve consistency özellikleri diğerine otomatik taşınmaz. MongoDB document model’inde collection içindeki fields farklı olabilir; bu, application’ın field anlamlarını düşünmemesi demek değildir. MongoDB schema validation destekler; embedding veya referencing seçimi application access pattern’i ve relationship ownership’iyle yapılır.

Key-value model’de application key seçer, store karşılık gelen value’yu döndürür. public:note:tea lookup key’i örnekteki public note’u seçer; prefix authentication veya authorization uygulamaz. Local adapter JSON string saklar; application onu id/title/version içeren object’e çevirip shape’ini doğrular. Store’dan string gelmesi JSON’un doğru schema’da olduğunu kanıtlamaz. Redis GET için mevcut string, missing key ve wrong-type error farklı sonuçlardır; bu sözleşme bütün NoSQL ürünlerine genellenmez.

Data modeli seçilirken birlikte okunacak fields, birlikte atomic değişmesi gereken state ve authoritative owner belirlenir. MongoDB’de single-document write atomic olabilir; çok document değiştiren operation’ın bütünü tek atomic write değildir. Multi-document transactions da vardır. Redis EXEC commands’ı sıralı bir grup olarak işler, fakat SQL rollback davranışını aynen sağlamaz. Dersin local adapter’ı tek process’te serialized access kullanır; Redis veya MongoDB operation’ı değildir.

Lifetime, revision ve availability ayrı sonuçlardır

Örnekte note expiresAt=50 logical clock birimine sahiptir. Clock=49’da value bulunur; clock=50 expiry boundary’sinde missing olur. Bu gerçek wall-clock timer ölçümü değildir. Eviction ise lifetime bitmeden memory pressure veya policy nedeniyle key’in çıkarılmasıdır. Redis maxmemory policy key evict edebilir; noeviction yeni write’a error verebilir. Key hiç yaratılmamış da olabilir. Basit missing sonucu bu nedenleri tek başına ayırmaz.

TTL bir field değil store lifecycle contract’ıdır. Redis SET normal replacement’ta eski TTL’yi temizler; retention gerekiyorsa KEEPTTL gibi açık option vardır. EXPIRE key’e timeout koyar. Fixture replacement ve explicit eviction ayrı yerel olaylar olarak kayıtlıdır. GET success, persistence garantisi değildir; Redis’te RDB, AOF veya persistence olmadan çalışma farklı kayıp sınırları taşır. Burada memory-only adapter process dışına data saklamaz, orderly restart veya crash durability iddiası yoktur.

Version=1 okuyan application daha sonra owner’da version=2 görürse eski beklentiyle update kabul edilmemelidir. Local adapter expected ve current revision’ı tek serialized decision’da karşılaştırır; uyuşmazlıkta value değişmez. Bu distributed atomicity testi değildir; Redis WATCH/EXEC kendi optimistic condition sözleşmesine sahiptir. Unavailable store ayrı error’dur: missing gibi authoritative empty state’e çevrilmez. Replica visibility, consistency ve retry policy ürün/topology özelinde belirlenir.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

Version stale

  1. KV owner ve encoding seçildi

    public:note:tea, JSON string olarak saklanan public not key’idir. Key prefix’i data mapping içindir; actor’a okuma veya write izni vermez.

    KV operation context
    Key: public:note:tea
    Owner/version gate
    Version check pending
    Application state boundary
    State unchanged
  2. Expected ve current version ayrıldı

    stale kaydı expectedVersion=1 ve currentVersion=2 içerir. Caller’ın eski beklentisi, store’daki güncel Coffee note değerini authoritative olmaktan çıkarmaz.

    KV operation context
    Expected=1
    Owner/version gate
    Current=2
    Application state boundary
    Decision pending
  3. Serialized owner gate reddetti

    accepted=false selected single-owner decision’dır. Bu karar current version’ı karşılaştırıp stale update’i uygulamaz; ayrı read/write’ın her sistemde atomic olduğunu iddia etmez.

    KV operation context
    Version mismatch known
    Owner/version gate
    Accepted=false
    Application state boundary
    Update withheld
  4. After value korundu

    afterValue id=tea, title=Coffee note ve version=2 içerir. Negatif fixture yalnız ret label’ını değil güncel data’nın korunmasını da gösterir.

    KV operation context
    After: Coffee note
    Owner/version gate
    After version=2
    Application state boundary
    No stale overwrite
  5. Product atomicity yanlış genişletilmedi

    MongoDB single-document atomicity bütün updateMany işlemini otomatik atomic yapmaz. Redis EXEC de SQL rollback ile aynı contract değildir; operation scope açık tutulur.

    KV operation context
    Single-owner scope
    Owner/version gate
    Product scopes differ
    Application state boundary
    No collection-wide claim
  6. Persistence sonucu eklenmedi

    selectedModel persistence=none kullanır. State’in korunması memory adapter için bilinir; replica visibility, disk durability veya crash recovery kanıtı değildir.

    KV operation context
    Memory state preserved
    Owner/version gate
    Persistence=none
    Application state boundary
    Durability unestablished

Unavailable

  1. Unavailable kaydı seçildi

    unavailable.status=error’dır. Bu sonuç expiry veya eviction nedeniyle missing olan lookup ile aynı contract sonucu değildir.

    KV operation context
    Status: error
    Owner/version gate
    Fallback decision pending
    Application state boundary
    Default not created
  2. Missing dönüşümü reddedildi

    treatedAsMissing=false korunur. Owner’dan cevap alınamamasını empty note saymak authoritative state bilinmediğinde yeni yanlış state yaratabilir.

    KV operation context
    Error ≠ missing
    Owner/version gate
    Authoritative value UNKNOWN
    Application state boundary
    No guessed empty note
  3. Default creation sınırı kapandı

    createdDefaultNote=false’tur. Adapter error, başarıyla missing okuyan path’e geçirilmediği için state-changing fallback başlatılmaz.

    KV operation context
    Unavailable known
    Owner/version gate
    Default creation=false
    Application state boundary
    No state-changing fallback
  4. Cache ve authority ayrıldı

    Memory cache missing olduğunda başka owner’dan read gerekebilir. Bu fixture authoritativeForFixtureOnly=true der; gerçek database fallback owner’ı tanımlanmış sayılmaz.

    KV operation context
    Fixture owner only
    Owner/version gate
    External fallback unspecified
    Application state boundary
    No invented source value
  5. Başarı cevabı persistence olmadı

    Redis GET success bile persistence kanıtı değildir. Burada error sonucu için daha da az state kanıtı vardır; outage, missing ve durability ayrı sorulardır.

    KV operation context
    State unknown on error
    Owner/version gate
    Durability separate
    Application state boundary
    No clean default state
  6. Güvenli sonuç doğru raporlandı

    Bilinen sonuç error’ın missing’e çevrilmediği ve default note yaratılmadığıdır. Data gerçekten var mı, expired mı veya silindi mi bu branch’ten çıkarılamaz.

    KV operation context
    No false missing
    Owner/version gate
    No default mutation
    Application state boundary
    Data existence UNKNOWN

VARSAYIM · SINIR · KONTROL

Missing sonucu ownership’i açıklamaz

Key lookup missing olduğunda hangi data owner’ının okunduğunu ve adapter’ın hangi error’ları ayırdığını sor. Expired cache entry ile hiç yazılmamış authoritative record aynı product kararı değildir. Memory-only cache yokluğu database fallback gerektirebilir; authoritative store outage’ını missing’e çevirmek yanlış default state üretebilir. Örneğin logical lifetime ve availability=false koşulları bu ayrımı gösterir; gerçek Redis telemetry’si değildir.

Key naming data’yı düzenler; public prefix tek başına izin sağlamaz. JSON içindeki id, title ve version’ın beklenen shape’iyle eşleşmesi ayrı validation’dır. Store success’ı application semantics için yeterli sanmak yanlış note veya revision üzerinde karar vermeye yol açabilir. Field/schema kontrolü ile data ownership birlikte okunur; bu ikisi string lookup sonucundan türetilmez.

Atomicity etiketini operation sınırına bağla

Local adapter’ın expected revision reddi yalnız bir serialized owner decision’ı kanıtlar. Read ve write’ı ayrı adımlarda yapıp arada state değişebilmesini dışlamak başka varsayımdır. MongoDB single-document atomicity’sini bütün collection’a, Redis EXEC serialized processing’ini SQL rollback’e çevirmek de başka yanlış genellemelerdir. Etki, birbirine bağlı data’nın kısmen değişmesi veya stale kararın yeni state’i ezmesi olabilir; bu ders harmless version mismatch’te state’in korunduğunu gösterir.

Review sırasında başarı cevabını persistence ve replica visibility ile eşitleme. Process memory’sinde accepted update crash sonrasında kaybolabilir; TTL, eviction ve persistence policy farklı mekanizmalardır. Kontrol beklentisi selected operation scope, failure sonucu ve application fallback kararının açık olmasıdır. Burada gerçek cluster, replication lag, concurrent clients veya durability ölçümü yoktur; modelin sessizce bu yetenekleri varmış gibi çizmesi de yanlış kanıt olur.

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

Hareket olmadan bütün senaryoları oku

TTL ve eviction

  1. Logical clock sınırı okundu

    hit.clock=49 ve expiresAt=50 için value found’dur. Bu logical clock sonucu production Redis’in gerçek zaman veya eviction policy ölçümü değildir.

    Value/lifetime observation
    Clock=49
    Adapter contract review
    Expires at=50
    Evidence conclusion
    Status=found
  2. Expiry equality sonucu eşleştirildi

    expiry.clock=50 anında status=missing ve fixtureReason=expired’dır. Sınır anı normal hit’ten farklıdır; equality hâlâ found diye okunmaz.

    Value/lifetime observation
    Clock=50
    Adapter contract review
    Status=missing
    Evidence conclusion
    Reason=expired
  3. Pre-expiry eviction ayrı tutuldu

    eviction.clock=49 için status=missing’tir. Reason explicit authored eviction event olduğundan bu missing, clock=50 expiry ile aynı neden değildir.

    Value/lifetime observation
    Eviction at=49
    Adapter contract review
    Missing before expiry
    Evidence conclusion
    Cause differs
  4. Runtime reason genellenmedi

    fixtureReason bu örneğin gözlem alanıdır. Gerçek adapter her missing sonucunda expiry, eviction veya hiç yazılmama nedenini ayrı sunmak zorunda değildir.

    Value/lifetime observation
    Fixture cause known
    Adapter contract review
    Product cause may be unknown
    Evidence conclusion
    No invented telemetry
  5. Replacement TTL contract’ı okundu

    replacement oldExpiresAt=50, newExpiresAt=null ve ttlPreserved=false içerir. Replacement seçimi TTL’yi temizler; eski TTL’nin korunacağı varsayılmaz.

    Value/lifetime observation
    Old TTL boundary=50
    Adapter contract review
    New expiry=null
    Evidence conclusion
    TTL preserved=false
  6. Lifetime ile persistence ayrıldı

    Expiry, eviction ve replacement farklı lifetime mekanizmalarıdır. Hiçbiri tek başına disk restore, replication veya process crash sonrası data varlığı kanıtı değildir.

    Value/lifetime observation
    Lifetime rules known
    Adapter contract review
    Persistence separate
    Evidence conclusion
    No restore guarantee

Copy ve selector

  1. Found value encoding’i incelendi

    Store JSON string tutar; hit.value id=tea, title=Tea note ve version=1 olarak parsed data’dır. Store lookup ile shape validation aynı operation değildir.

    Value/lifetime observation
    Stored: JSON string
    Adapter contract review
    Returned: parsed data
    Evidence conclusion
    Copy review pending
  2. Application copy boundary okundu

    applicationMutationChangesStore=false dönen object’in store state’inden ayrı olduğunu bildirir. Local field değiştirmek store’a otomatik update göndermek değildir.

    Value/lifetime observation
    Returned copy independent
    Adapter contract review
    Store mutation=false
    Evidence conclusion
    No shared-object assumption
  3. Error selector koşulu tanımlandı

    Selector status=error ve treatedAsMissing=true olan observation’ları sayar. Normal error kaydı treatedAsMissing=false olduğundan expected=0’dır.

    Value/lifetime observation
    Error/missing conversion condition
    Adapter contract review
    Normal expected=0
    Evidence conclusion
    Negative policy retained
  4. Pozitif comparison sınırlandı

    positiveExpected=1 yalnız inconsistent observation karşılaştırmasıdır. Bu alan product’ın gerçekten error’ı missing’e dönüştürdüğü olay gibi raporlanmaz.

    Value/lifetime observation
    Comparison expected=1
    Adapter contract review
    Fixture only
    Evidence conclusion
    No actual incident claim
  5. Eksik observation sonucu ayrıldı

    Record veya treatedAsMissing field’ı yoksa count=0 doğru error handling kanıtı olmaz. Adapter outcome ve application fallback için coverage gerekir.

    Value/lifetime observation
    Coverage may be missing
    Adapter contract review
    Handling UNKNOWN
    Evidence conclusion
    No clean selector conclusion
  6. Copy, policy ve product scope’u ayrıldı

    Parsed copy ve finite decision memory adapter’a aittir; productsExecuted=[] kalır. Gerçek Redis/MongoDB davranışı veya namespace authorization için ayrı kanıt gerekir.

    Value/lifetime observation
    Local copy behavior known
    Adapter contract review
    Products not executed
    Evidence conclusion
    Permission separate

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

Adapter contract’ını uygulama kararına bağla

Application sınırında get sonucu için found/value, missing ve unavailable/error ayrımını yaz. Value’nun schema validation’ı store operation’dan sonraki ayrı local adımdır; fixture parsed object’i kopya olarak döndürerek application mutation’ının store’u sessizce değiştirmemesini sağlar. Key mapping yalnız public synthetic note için seçilmiştir. Gerçek uygulamada identity/authorization, namespace isolation ve result presentation ayrıca tasarlanır.

Missing için fallback varsa hangi owner’dan read yapılacağını ve error’da neyin authoritative sayılacağını belirle. Bu örnekte unavailable sonucu empty note yaratmaz, state-changing karar durur. Cache’in authoritative database gibi kullanılması bu contract’tan çıkarılamaz. Expiry/eviction işaretlerini debug amaçlı ayrı gözlemlemek yararlıdır; gerçek adapter her sebebi bilmeyebilir. Bu nedenle missing reason field’ı authored fixture observability’sidir, bütün Redis clients’ın sunduğu runtime field değildir.

Lifecycle policy’sini bağımsız doğrula

Logical clock ile expiry’nin hemen öncesini ve boundary anını karşılaştır; aynı value için expiry öncesindeki eviction ayrı sonuç olsun. Replacement’ın lifetime’ı koruyup korumadığı operation contract’ına yazılır. Redis policy’si seçilirken ürün dokümanı ve workload gerekir; örnekteki saat veya capacity değerleri production ayarı değildir. Local adapter’ın sonucu gerçek Redis/MongoDB davranışının kanıtı sayılmaz.

Revision için current version’ı bağımsız read ile gözle; stale update sonrasında value’nun korunmasını doğrula. Local operation tek owner decision’ıdır; başka ürünlerde conditional write, transaction ve consistency sınırları kendi sözleşmelerine bağlıdır. Persistence gerekiyorsa process memory, snapshot, append-only log ve restore ayrı ele alınır. Accepted memory update, crash sonrasında korunmuş data veya replica’da görünür state anlamına gelmez.

ŞİMDİ VAKAYA UYGULA

Missing, unavailable ve stale version neden aynı karar değildir?

Public note memory adapter’ında error default note üretmez; stale version güncel state’i korur. TTL, eviction, replacement ve parsed copy ayrı alanlarla incelenir.

Vakadaki cached representation’ı authoritative data owner’la karşılaştır. Stored value, revision, transaction ve cache copy için aynı completion sonucunu kullanma.

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

ÖRNEĞİ BİRLİKTE OKUYALIM

Public note key/version/lifetime ledger

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

Ham kaydı ve alan açıklamalarını oku
{
  "selectedModel": {
    "runtime": "own Python in-memory adapter, serialized owner access",
    "productsExecuted": [],
    "key": "public:note:tea",
    "valueEncoding": "JSON string",
    "authoritativeForFixtureOnly": true,
    "persistence": "none"
  },
  "hit": {
    "clock": 49,
    "expiresAt": 50,
    "status": "found",
    "value": {
      "id": "tea",
      "title": "Tea note",
      "version": 1
    },
    "applicationMutationChangesStore": false
  },
  "expiry": {
    "clock": 50,
    "status": "missing",
    "fixtureReason": "expired"
  },
  "eviction": {
    "clock": 49,
    "status": "missing",
    "fixtureReason": "explicit authored eviction event, not measured Redis policy"
  },
  "stale": {
    "expectedVersion": 1,
    "currentVersion": 2,
    "accepted": false,
    "afterValue": {
      "id": "tea",
      "title": "Coffee note",
      "version": 2
    },
    "decisionScope": "selected serialized single owner"
  },
  "unavailable": {
    "status": "error",
    "treatedAsMissing": false,
    "createdDefaultNote": false
  },
  "replacement": {
    "oldExpiresAt": 50,
    "newExpiresAt": null,
    "ttlPreserved": false,
    "contract": "selected replacement clears TTL; Redis SET reference only"
  },
  "productScopes": {
    "mongoSingleDocumentAtomic": true,
    "mongoUpdateManyWholeAutomaticallyAtomic": false,
    "redisExecIsSqlRollback": false,
    "redisGetSuccessProvesPersistence": false
  },
  "selector": {
    "language": "XPath",
    "xml": "<audit><kv status=\"error\" treatedAsMissing=\"false\"/></audit>",
    "xpath": "count(/audit/kv[@status='error' and @treatedAsMissing='true'])",
    "expected": 0,
    "positiveFixtureXml": "<audit><kv status=\"error\" treatedAsMissing=\"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."
  }
}
selectedModel
Local adapter scope; ürün runtime’ı değil.
hit/expiry/eviction
Logical clock ve farklı missing koşulları.
stale
Expected revision ile current value korunması.
unavailable/replacement
Error semantiği ve seçilmiş TTL replacement contract.
selector
Synthetic missing/error kararını sayan inert XPath.

Public note için memory-only Python adapter kullanılır. Redis/MongoDB, cluster, gerçek timer veya durability sonucu değildir; missing reason örneğin observation field’idir.

İki yanlış kanı

NoSQL schema veya transaction gerektirmez.

Data contract her model’de gerekir; selected product document validation ve farklı atomicity/transaction scope sunabilir.

Key bulunamadıysa store erişilebilir ve authoritative state boş demektir.

Missing’in birden çok nedeni vardır; unavailable ayrı error’dur. Cache yokluğu authoritative record yokluğuna eşit değildir.

SIRA SENDE

Bu hikâyeyi sen çöz.

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

Adapter hata döndürdü. Bu sonucu key bulunamadı diye yorumlayıp varsayılan note oluşturabilir miyiz?

  1. Evet. Başarısız her GET, key’in bulunmadığını kanıtlar.
  2. Hayır. treatedAsMissing=false; varsayılan note oluşturulmaz.
Gerekçeli cevabı oku

Hayır. treatedAsMissing=false; varsayılan note oluşturulmaz. — Hata, store’daki kaydın var olup olmadığını söylemez. Bu bilinmeyen sonucu missing olarak yorumlayıp yeni veri oluşturmak doğru değildir.

Bu replacement işleminde TTL korunuyor mu? Örnek gerçek Redis üzerinde mi çalışıyor?

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

selectedModel
{"runtime":"own Python in-memory adapter, serialized owner access","productsExecuted":[],"key":"public:note:tea","valueEncoding":"JSON string","authoritativeForFixtureOnly":true,"persistence":"none"}
replacement
{"oldExpiresAt":50,"newExpiresAt":null,"ttlPreserved":false,"contract":"selected replacement clears TTL; Redis SET reference only"}
  1. TTL temizleniyor; productsExecuted listesi boş.
  2. Redis GET başarılı olduğu için TTL ve persistence korunur.
Gerekçeli cevabı oku

TTL temizleniyor; productsExecuted listesi boş. — newExpiresAt=null ve ttlPreserved=false, bu adapter’ın tanımlı sonucudur. In-memory adapter’ın çalışması gerçek Redis testi değildir.

MongoDB single-document atomicity, updateMany ve Redis EXEC neden SQL transaction rollback ile aynı kavram değildir?

Gerekçeli cevabı oku

Bir document güncellemesinin atomic olması, bütün updateMany işleminin tek atomic işlem olduğu anlamına gelmez. Redis EXEC de SQL transaction rollback davranışıyla eşitlenmez. Buradaki stale-version rejection, işlemleri sırayla değerlendiren yerel owner modelinin sonucudur. Gerçek Redis/MongoDB deployment’ı veya distributed atomicity test edilmemiştir.

□ Atomicity’nin kapsamını işlem ve ürün sözleşmesine bağladım.

□ In-memory adapter’ı gerçek ürün testi saymadım.

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

Kaynaklar ve kapsam