İki katman, tek API
Sistem L1 (in-process memory) + L2 (Redis) birleşik cache kullanır. Alt katman .NETHybridCache (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:
- Test edilebilir abstraction —
HybridCache’i doğrudan inject etmek yerine interface üzerinden. - 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:
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ı
- DB güncellenir — komut handler içinde.
- Tag-bazlı eviction — domain event handler
RemoveByTagAsync("faqs")çağırır; L2’de tag işaretlenir (lazy invalidation), local L1 düşer. - Diğer node’lar bilgilendirilir —
Cache:BroadcastTagInvalidationaçıksaCacheInvalidationIntegrationEventRabbitMQ üzerinden yayınlanır; her node kendi L1’ini düşürür.
Konfigürasyon
| Anahtar | Varsayılan | Anlamı |
|---|---|---|
Cache:Enabled | — | Spec/DB query cache kill-switch. false ise CachedRepository raw EF Core’a düşer. |
Cache:L1:Ttl | 00:01:00 (1 dk) | L1 (memory) varsayılan TTL. Multi-instance’da L2’den kısa olmalı. |
Cache:L2:Ttl | 00:05:00 (5 dk) | L2 (Redis) varsayılan TTL. Spec WithCacheTtl(...) ile per-entry override edebilir. |
Cache:BroadcastTagInvalidation | false | Multi-instance L1 senkronizasyonu için tag invalidation broadcast’i. Single-node’da gereksiz. |
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ışı.