Immaginate una situazione tipica: il tenant A è una piccola startup di cinque persone che genera un traffico di ricerca prevedibile e moderato. Il tenant B, invece, è una grande impresa Fortune 500 che condivide la stessa infrastruttura di database vettoriale. All’improvviso, il tenant B avvia un massiccio aggiornamento batch di embedding, scaricando 50 milioni di vettori nel cluster in un solo colpo. In pochi secondi la cache RAM del grafo vettoriale del tenant A viene svuotata, facendo schizzare la latenza di ricerca da un agile 8 ms a un disastroso 4 200 ms, ben al di sopra dell’SLA concordato.

Perché il caching tradizionale relazionale non funziona sui vettori

Le basi di dati relazionali operano su B‑tree e tabelle sequenziali, dove la località spaziale dei dati consente ai cache LRU di pre‑caricare facilmente i blocchi di lavoro. I database vettoriali, al contrario, eseguono attraversamenti di grafi ad alta dimensionalità (ad esempio HNSW), saltando tra puntatori di nodo sparsi in memoria senza alcuna località spaziale.

Questa caratteristica impone che l’intero grafo multi‑livello rimanga residente in RAM per garantire tempi di risposta rapidi; altrimenti, ogni ricerca deve attraversare pagine di memoria non presenti, provocando costosi fault di pagina.

Il “tax” di memoria del grafo nascosto

    • Memorizzare 1 000 000 di embedding a 1 536 dimensioni in float32 richiede circa 6 GB di dati grezzi.
    • Mantenere il grafo HNSW, con tutti i puntatori, le liste di candidati per ciascun nodo e l’allineamento strutturale, gonfia il consumo a circa 118 GB.
    • Il sovraccarico strutturale è quindi quasi 20 volte superiore al payload originale.

La cascade di eviction della cache: anatomia di un meltdown

Quando un tenant immette milioni di vettori in memoria condivisa, le pagine della cache del sistema operativo, ignare delle priorità di business, iniziano a espellere le pagine del grafo dei tenant vicini. Questo avvia una catena di cinque passaggi che può colpire tutti i tenant.

    • Invalidazione della pagina: le scritture ad alto volume cancellano i set di pagine adiacenti al grafo del tenant.
    • Cache miss: le query successive non trovano le pagine del grafo in RAM.
    • Page fault di storage: il kernel sospende l’esecuzione per recuperare le pagine dal disco.
    • Stalli di I/O amplificati: poiché HNSW esplora più rami contemporaneamente, una singola query genera decine di letture sequenziali, trasformando nanosecondi in millisecondi.
    • Esaurimento del thread pool: i worker del database restano bloccati in attesa di I/O, facendo accumulare le richieste successive e facendo crollare gli SLA globali.

Trappole architetturali naive

Esistono tre approcci tradizionali che, sebbene intuitivi, non risolvono il problema.

    • Modello pool: tutti i tenant condividono un unico indice HNSW. Anche filtrando per tenant ID, le query attraversano nodi di altri tenant, contaminando le cache L1/L2 della CPU e rivelando pattern di ricerca incrociati.
    • Modello silo: si creano indici o istanze isolate per ogni tenant. Questo garantisce la sicurezza, ma genera un enorme spreco di RAM per migliaia di account a bassa attività.
    • Trappola Postgres/PGVector con RLS: l’applicazione di Row‑Level Security dopo il filtraggio dei risultati vettoriali nasconde 9 su 10 vicini restituiti, provocando il temuto “empty result” e riducendo drasticamente il recall.

Soluzioni moderne a tiered multi‑tenancy

Le piattaforme più recenti introducono pattern di tiering dinamico che consentono isolamento rigido senza sacrificare l’utilizzo delle risorse.

Weaviate: ciclo di stato degli shard

Un controller centrale gestisce dinamicamente gli shard dei tenant, spostandoli tra tre stati:

    • Active: grafo HNSW residente in RAM, pronto per risposte a bassa latenza.
    • Inactive: grafo memorizzato su disco con mmap, pronto a essere caricato rapidamente.
    • Offloaded: dati archiviati in storage a freddo, recuperabili solo su richiesta di picco.

Il passaggio tra gli stati avviene in base a metriche di utilizzo (frequenza di query, dimensione del dataset) e avviene senza downtime.

Qdrant: shard di fallback densi

Qdrant aggrega migliaia di tenant inattivi in partizioni dense su disco. Quando l’attività di un tenant aumenta, lo shard viene promosso automaticamente a una configurazione in‑memory dedicata.

Promozione dinamica degli shard

Il meccanismo di promozione automatica consente a una startup in crescita di passare da storage condiviso a hardware in‑memory ad alte prestazioni senza migrazioni manuali, mantenendo invariati gli endpoint API e gli SLA.

Confronto tra approcci tradizionali e tiered multi‑tenancy

CaratteristicaModello poolModello siloTiered (Weaviate/Qdrant)
Isolamento SLADeboleElevatoElevato, con fallback controllato
Utilizzo RAMMassimoMinimo per tenant, ma spreco globaleOttimizzato dinamicamente
Complessità operativaBassaAlta (gestione migliaia di istanze)Media (controller centralizzato)
Rischio di eviction cascadeAltoBassoControllato tramite stato shard

Best practice per implementare una multi‑tenant RAG resiliente

    • Monitorare costantemente i KPI di cache hit/miss per ogni tenant.
    • Impostare soglie di write‑through per batch di embedding, evitando picchi improvvisi.
    • Utilizzare meccanismi di throttling a livello di tenant per limitare il volume di scrittura simultanea.
    • Adottare policy di eviction basate su priorità di business anziché LRU puro.
    • Integrare un controller di shard che possa spostare dinamicamente i dati tra RAM, mmap e storage a freddo.

Risorse correlate per approfondire

Questi approfondimenti offrono ulteriori spunti su come ottimizzare la ricerca vettoriale, gestire la memoria GPU e progettare architetture AI affidabili.

Conclusioni

Nel contesto enterprise di AI e SaaS B2B, una soluzione RAG multi‑tenant deve bilanciare l’efficienza dell’infrastruttura con la garanzia di isolamento SLA. I modelli tradizionali di caching relazionale e le architetture naive non riescono a gestire la complessità dei grafi HNSW, portando a catene di eviction che compromettono l’intera piattaforma. Le moderne strategie tiered, come quelle implementate da Weaviate e Qdrant, forniscono un meccanismo di promozione e fallback dinamico che mantiene i dati critici in RAM per i tenant più attivi, mentre sposta in modo sicuro i carichi inattivi verso storage più economici. Applicando le best practice sopra elencate, le organizzazioni possono evitare il “vicino rumoroso”, garantire prestazioni costanti e scalare in modo sostenibile la loro offerta RAG.