FusionCache: hybrid caching in .NET
Jody Donetti
R&D + coding
FusionCache
Free + OSS
Jody Donetti
R&D + coding
Faccio cose (principalmente) sul web da quasi 30 anni.
Ho avuto a che fare con la maggior parte dei tipi di cache: memory, distributed, hybrid, HTTP, CDN, offline.
🏆 Google Open Source Award
🏆 Microsoft MVP Award
FusionCache
Free + OSS
E’ una hybrid cache facile da usare, veloce e robusta con funzionalità di resilienza avanzate.
Battle tested in produzione da anni, usata anche da Microsoft (eg: Data API Builder).
⬇️ 6M+ downloads
⭐ 1600+ stars
🧠 Cosa significa usare una cache?
🧠 Cosa significa usare una cache?
Accettare un compromesso.
Utilizzare una copia del dato originale
potenzialmente non aggiornata
in cambio di performance
e robustezza.
🧠 Quanto è importante?
E’ parte delle fondamenta stesse del web:
Senza caching il web non esisterebbe.
🧠 Quanto è importante?
Di nuovo: senza caching il web non esisterebbe.
Gheto capio? 😬
🤓 Tipi di cache
Quali sono i principali tipi di cache?
In breve:
Pro e contro?
🤓 Memory Cache
E’ il tipo di cache base, rappresenta una cache in-memory (in-process).
In pratica, è un concurrent dictionary + expiration.
Caratteristiche principali:
✅ data locality: i dati sono nella stessa memoria dell’applicazione
✅ cost: no chiamate remote, no (de)serializzazione
✅ always there: sempre disponibile
❌ cold starts: ad ogni riavvio la cache è vuota
❌ scaling orizzontale: dati non condivisi con altri nodi
🤓 Distributed Cache
Rappresenta tipicamente un key-value store remoto (eg: Redis, Memcached).
Caratteristiche principali:
❌ data locality: i dati sono out of process, tipicamente remoti
❌ cost: chiamate remote + (de)serializzazione
❌ always there: potrebbe non essere sempre disponibile
✅ cold starts: ad ogni riavvio la cache è già popolata
✅ scaling orizzontale: dati condivisi con altri nodi
NOTA: più precisamente è «out of process», vedi SQLite.
🤓 Hybrid Cache
E’ il tipo di cache più avanzato.
Può essere composta da un solo livello (L1, memory) o da più livelli (L1 + L2, memory + distributed).
Gestisce in modo trasparente il coordinamento fra i diversi livelli e più nodi.
Caratteristiche principali:
✅ data locality: i dati sono nella stessa memoria dell’applicazione (L1)
✅ cost: no chiamate remote, no (de)serializzazione (L1)
✅ always there: sempre disponibile (L1)
✅ cold starts: ad ogni riavvio L1 è vuota, ma si popola automaticamente da L2 (già popolata)
✅ scaling orizzontale: dati condivisi con altri nodi (L2)
In breve: unisce il meglio di entrambi i mondi, memory e distributed.
🦥 FusionCache
Hybrid cache basata su IMemoryCache (L1) + IDistributedCache (L2, opzionale).
Supporta:
🦥 FusionCache
😩��“C’ho Probblemi”�(cit. Herbert Ballerina)
🛡️ Cache Stampede
🛡️ Cache Stampede Prevention
Basta usare il metodo GetOrSet() invece che Get() + Set() separate.���������������
⚠️ GetOrCreate() in MemoryCache non protegge da Cache Stampede
🛡️ Cache Stampede (dopo)
💣 Database Failures
💀
💥
💥
💥
💣 Fail-Safe
���������������💪 aiuto contro attacchi DDoS
❤️ Sidney Lumet
💣 Database Failures (dopo)
💀
💥
💥
👍
⏱️ Database Lento
⏱️ Timeouts (Soft + Hard)
���������������⚡ Background Factory Completion (niente sprechi!)
🌍 SEO (Web Vitals: TTFB/LCP/CLS)
⏱️ Database Lento (dopo)
🦅 Eager Refresh
Se arriva una richiesta dopo X % della Duration, esegui un background refresh non bloccante.���������������ℹ️ Valori ragionevoli possono essere da 80% (0.8) in su
⚠️ Valori troppo bassi come 10% (0.1) creerebbero un ciclo continuo di refresh, sovraccaricando il database
🧙♂️ Adaptive Caching
🔂 Conditional Refresh
🔀 2nd Level
Basta aggiungere un setup iniziale:
������������ℹ️ Qualunque implementazione di IDistributedCache è supportata (Redis, Memcached, etc)
🧑🎤 Sincronicità
Ogni nodo ha una sua memory cache.
A fronte di un update su un nodo, vengono aggiornati:
Se quel dato fosse però già presente nella memory cache di altri nodi, si creerebbe un problema di disallineamento.
📢 Backplane
Basta aggiungere un setup iniziale:
���������
🐲 Hic Sunt Dracones
La distributed cache ed il backplane sono component distribuiti: Fallacies of Distributed Computing (vedere Wikipedia)!��E quindi cosa succede se, per esempio, database e memory cache funzionano correttamente ma la distributed cache risulta temporaneamente non disponibile?
O il backplane? O entambi?�
Oppure avvengono 2 operazioni, per lo stesso dato, in rapida successione e su due nodi diversi e le relative chiamate a distributed cache e backplane hanno errori transienti?
O dei ritardi? O un mix di errori transienti e ritardi?��Oppure...
↩️ Auto-Recovery
������������😉 Demo a breve...
🔭 Observability
Full observability, including OpenTelemetry, for:
🔭 Observability (risultati)
Utilizzabile con qualunque software compatibile con OpenTelemetry come Jaeger, Prometheus, Honeycomb, etc.
😑 Aspetta, non sto capendo
I sistemi distribuiti in generale possono diventare molto complessi.
Le nostre infrastrutture possono diventare molto complesse, ed essere anche distribuite.
Il caching può essere molto complesso, ed essere anche distribuito.
FusionCache è una cache ibrida, opzionalmente distribuita, che lavora con le nostre infrastrutture, anch’esse distribuite.
“Ah, ok” (cit)
🖥️ Simulator
🖥️ Demo Time
🦥 FusionCache
🦥 Idealmente
�����������������Ci aiuta quando 💩 hits the fan
🆕 HybridCache (from Microsoft)
Col rilascio di .NET 9 verso metà/fine novembre Microsoft introdurrà una sua hybrid cache, chiamata HybridCache (bel nome 😏).
Usa IMemoryCache (L1) + IDistributedCache (L2, opzionale).
Offre Cache Stampede protection e eviction notification (vedi Backplane di FusionCache).
Si, suona familiare 🙂
Oltre ad essere una implementazione di base è anche una shared abstraction (nota: abstract class, non interface): idealmente potrebbe diventare una sorta di lingua franca per le hybrid cache in .NET, come IDistributedCache lo è già per le cache distribuite.
🆕 HybridCache e FusionCache
Feature in comune (sia FusionCache che HybridCache):
🆕 HybridCache e FusionCache
Feature esclusive di FusionCache:
🆕 HybridCache e FusionCache
Feature esclusive di Microsoft HybridCache (forse):
NOTA: in realtà sto già lavorando ad entrambe.
🆕 HybridCache e FusionCache
E FusionCache in tutto questo?
FusionCache continuerà a progredire ed evolversi come ha fatto fino ad oggi, in modo indipendente.
Ma: sarà anche disponibile come implementazione 3rd party di HybridCache di Microsoft (sarà la prima).
Più info https://github.com/ZiggyCreatures/FusionCache/discussions/266
🖥️ Demo Time
❤️ Grazie
👋 Contatti
/jodydonetti
/jody-donetti
/jody-donetti
/ZiggyCreatures/FusionCache
/FusionCache