Skip to main content

İki katman, tek API

Sistem L1 (in-process memory) + L2 (Redis) birleşik cache kullanır. Alt katman .NET HybridCache (Microsoft.Extensions.Caching.Hybrid) infrastructure’ı; uygulama kodu bunu doğrudan değil, BuildingBlocks.Caching.IHybridRequestCache arayüzü üzerinden görür. IHybridRequestCache, HybridCache’in üzerine ince bir wrapper’dır (HybridRequestCache). Tek başına HybridCache zaten L1 + L2 + stampede protection + tag-based invalidation veriyor; wrapper yalnızca iki şey ekler:
  1. Test edilebilir abstractionHybridCache’i doğrudan inject etmek yerine interface üzerinden.
  2. Multi-instance broadcast hook’u — tag invalidate edilince diğer node’ların L1’ini de düşürmek için (IRemoteTagBroadcaster).

Cache opt-in: spec tabanlı

Cache her query’de otomatik açık değildir. CachedRepository<T> decorator yalnızca spec üzerinde EnableCache(...) zinciri kurulmuşsa cache’ler. Komut/handler tarafı cache hakkında hiçbir şey bilmez — kararı spec verir:
Query
  .Where(f => f.IsActive)
  .EnableCache(nameof(PublicFaqsPagedSpecification), filter.Page, filter.PageSize, filter.SearchTerm)
  .WithCacheTtl(TimeSpan.FromMinutes(5))
  .WithTags(CacheTag);   // "faqs"
Public liste spec’leri cache’i açar (sık çağrılır, invalidate kuralı net), admin spec’leri açmaz (anlık değişiklik görünsün). Ayrıntı: Hybrid Cache.
Cache:Enabled bayrağı yalnızca spec/DB query cache’ini (CachedRepository) etkiler. UserContextCache, JWKS, Keycloak PKCE state gibi auth/token cache’leri HybridCache’i doğrudan kullanır ve bu bayraktan etkilenmez (auth cache’siz çalışamayacağı için kasten ayrı tutulur).

Invalidation — event-driven, tag-bazlı

  1. DB güncellenir — komut handler içinde.
  2. Tag-bazlı eviction — domain event handler RemoveByTagAsync("faqs") çağırır; L2’de tag işaretlenir (lazy invalidation), local L1 düşer.
  3. Diğer node’lar bilgilendirilirCache:BroadcastTagInvalidation açıksa CacheInvalidationIntegrationEvent RabbitMQ üzerinden yayınlanır; her node kendi L1’ini düşürür.
Ayrıntı: Invalidation ve Multi-Instance Senkron.

Konfigürasyon

{
  "Cache": {
    "Enabled": true,
    "L1": { "Ttl": "00:01:00" },
    "L2": { "Ttl": "00:05:00" },
    "BroadcastTagInvalidation": false
  }
}
AnahtarVarsayılanAnlamı
Cache:EnabledSpec/DB query cache kill-switch. false ise CachedRepository raw EF Core’a düşer.
Cache:L1:Ttl00:01:00 (1 dk)L1 (memory) varsayılan TTL. Multi-instance’da L2’den kısa olmalı.
Cache:L2:Ttl00:05:00 (5 dk)L2 (Redis) varsayılan TTL. Spec WithCacheTtl(...) ile per-entry override edebilir.
Cache:BroadcastTagInvalidationfalseMulti-instance L1 senkronizasyonu için tag invalidation broadcast’i. Single-node’da gereksiz.
Kayıt sırası kritiktir: AddRedisCacheAddCacheAddHybridCache. Sıra bozulursa HybridCache L1-only mode’a düşer. Ayrıntı: Hybrid Cache.

Bu bölümde

Hybrid Cache

IHybridRequestCache API, kayıt sırası, stampede protection, spec cache.

Invalidation

CacheTags, domain event handler’da RemoveByTagAsync.

Multi-Instance Senkron

EventBusRemoteTagBroadcaster + echo guard ile L1 broadcast.

Event Akışı

Domain event ve integration event’lerin tam akışı.