Architettura Multi-Server: Separazione delle Competenze
Questo articolo spiega come la nostra infrastruttura utilizzi server specializzati per ottenere scalabilità, affidabilità e prestazioni attraverso la separazione delle competenze.
Il Problema: Limitazioni del Server Monolitico
Eseguire tutto su un unico server causa:
-
Contesa delle risorse: Il server web compete con il servizio di ricerca per CPU/memoria
-
Difficoltà di scalabilità: Impossibile scalare i componenti in modo indipendente
-
Punto singolo di guasto: Un server down = intero sistema down
-
Inefficienza dei costi: Impossibile ottimizzare i tipi di istanza per carico di lavoro
-
Rischio di deployment: Il deployment di un componente influisce su tutti gli altri
Abbiamo bisogno della separazione delle competenze su più server.
La Soluzione: Ruoli Specializzati dei Server
Utilizziamo server specializzati, ciascuno ottimizzato per il proprio carico di lavoro:
graph TB
subgraph prod[Server ERP di Produzione]
erp[Gestione interna
HR, Finanza, Produzione
Uptime 24/7
Storage condiviso & email]
end
subgraph web[Server Sito Web Pubblico]
www[Sito Web Pubblico
Catalogo prodotti, blog
Uptime 24/7
Dietro CDN]
end
subgraph dev[Server di Sviluppo/Staging]
devenv[Dev & Staging
Campagne email
Si spegne di notte/nei weekend]
end
subgraph search[Server Servizio di Ricerca]
searchsvc[Ricerca Vettoriale
Estrazione filtri
Ricerche correlate
Uptime 24/7]
end
subgraph cache[Server Cache - Valkey]
valkey[Indici RediSearch
Embeddings delle query
Autocompletamento
Uptime 24/7]
end
www --> searchsvc
searchsvc --> valkeyPerché Server Separati?
1. Isolamento delle Risorse
Ogni server esegue un tipo di carico di lavoro:
Server Web: Ottimizzato per la gestione di richieste HTTP
-
Alta larghezza di banda di rete
-
CPU moderata
-
Memoria moderata
-
Disco veloce per la cache
Servizio di Ricerca: Ottimizzato per operazioni vettoriali
-
Alta CPU (similarità coseno)
-
Alta memoria (cache degli embedding)
-
Basso I/O su disco
Server Cache: Ottimizzato per l'accesso in memoria
-
Memoria molto alta
-
Bassa CPU
-
Rete veloce
Vantaggio: Nessuna contesa di risorse tra i carichi di lavoro.
2. Scalabilità Indipendente
Possiamo scalare ogni componente in modo indipendente:
-
Traffico elevato? Aggiungi più server web dietro un load balancer.
-
Ricerca lenta? Aggiorna la CPU del server di ricerca o aggiungi repliche.
-
Cache miss? Aumenta la memoria del server cache.
-
Vantaggio: Scala solo ciò che ha bisogno di scalare, non tutto.
3. Isolamento dei Guasti
I guasti sono contenuti:
Servizio di ricerca down? Il sito web serve ancora risultati in cache.
Server cache down? Il servizio di ricerca calcola senza cache (più lento ma funzionale).
Server web down? L'ERP interno non è influenzato.
Vantaggio: I guasti parziali non si propagano a cascata all'intero sistema.
4. Sicurezza del Deployment
Effettuiamo il deployment attraverso ambienti:
Sviluppo → Testa le modifiche con strumenti di debug
Staging → Testa in un ambiente simile alla produzione
Produzione → Effettua il deployment con sicurezza
Vantaggio: Rileva i problemi prima che raggiungano gli utenti.
5. Ottimizzazione dei Costi
Ottimizziamo i costi per server:
-
Server di sviluppo: Si spegne di notte/nei weekend (riduzione del 50% dei costi)
-
Server solo IPv6: Nessun costo per IP elastici (risparmio di $5/mese per istanza)
-
Istanze dimensionate correttamente: Paghi solo per le risorse necessarie per carico di lavoro
-
Vantaggio: Costi infrastrutturali più bassi senza sacrificare le prestazioni.
Flusso dei Dati tra i Server
Comprendere come fluiscono i dati aiuta a spiegare perché la separazione è importante:
Flusso di una Richiesta Utente
Richiesta Pagina Prodotto:
sequenceDiagram
participant User
participant CDN
participant Web as Web Server
participant Search as Search Service
participant Cache as Cache Server
User->>CDN: Richiesta pagina prodotto
CDN->>CDN: Controlla cache
alt Cache hit
CDN->>User: Restituisce pagina in cache
else Cache miss
CDN->>Web: Inoltra richiesta
Web->>Search: Ottieni prodotti correlati
Search->>Cache: Query embeddings
Cache->>Search: Restituisce risultati
Search->>Web: Prodotti correlati
Web->>CDN: Pagina renderizzata
CDN->>CDN: Cache risposta
CDN->>User: Restituisce pagina
endFlusso Query di Ricerca:
sequenceDiagram
participant User
participant Web as Web Server
participant Search as Search Service
participant Cache as Cache Server
User->>Web: Invia query di ricerca
Web->>Search: Inoltra query
Search->>Search: Estrai filtri
Search->>Search: Calcola embedding
Search->>Cache: Ricerca vettoriale
Cache->>Search: Risultati classificati
Search->>Web: Corrispondenze prodotti
Web->>User: Renderizza risultatiVantaggio: Ogni server fa ciò per cui è ottimizzato.
Strategia di Storage per Server
Server diversi utilizzano strategie di storage diverse:
Server Web
File statici su S3: Immagini, CSS, JS serviti da S3
-
Alta disponibilità
-
Nessun utilizzo di disco locale
-
Compatibile con CDN
Cache locale: Nginx memorizza in cache le pagine renderizzate
-
Accesso rapido ripetuto
-
Invalidazione automatica
Servizio di Ricerca
Array NumPy: Embeddings dei prodotti memorizzati come array binari
-
Operazioni vettoriali veloci
-
Memory-mapped per efficienza
-
65K prodotti × 768 dimensioni = ~190 MB
File JSON: Mappature filtri, tabelle frasi
-
Leggibili dall'uomo
-
Facili da aggiornare
-
Dimensione ridotta (<10 MB)
Server Cache
Valkey (Redis): Embeddings delle query, query popolari, autocompletamento
-
In memoria per velocità
-
RediSearch per indici vettoriali
-
Persistenza per durabilità
Perché storage diversi?
-
NumPy: Ottimizzato per calcoli vettoriali (similarità coseno)
-
JSON: Ottimizzato per la modifica umana (regole filtri)
-
Valkey: Ottimizzato per ricerche chiave-valore (cache query)
Architettura CDN
Il sito web pubblico si trova dietro una Content Delivery Network:
Cosa Viene Memorizzato in Cache
Asset statici (TTL lungo):
-
Immagini, CSS, JavaScript
-
Font, icone
-
In cache per 1 anno
Pagine prodotto (TTL medio):
-
Descrizioni prodotto
-
Specifiche
-
In cache per 1 ora
Pagine query (TTL breve):
-
Risultati di ricerca
-
Combinazioni di filtri
-
In cache per 5 minuti
Non in cache:
-
Contenuti specifici utente
-
Endpoint API
-
Ricerca dinamica
Perché la CDN è Importante
-
Latenza globale: Le posizioni edge servono i contenuti più vicini agli utenti
-
Protezione origine: La CDN assorbe picchi di traffico, protegge il server origine
-
Mitigazione DDoS: La CDN filtra il traffico malevolo prima che raggiunga l'origine
-
Riduzione costi: Meno richieste all'origine = costi di calcolo inferiori
Pipeline di Deployment
Effettuiamo il deployment attraverso ambienti per rilevare i problemi in anticipo:
Ambiente di Sviluppo
Scopo: Iterazione rapida con strumenti di debug Caratteristiche:
-
Riavvio automatico alle modifiche del codice
-
Pagine di errore dettagliate
-
Barra strumenti di debug
-
Nessuna cache
Vantaggio: Ciclo di feedback rapido per gli sviluppatori.
Ambiente di Staging
Scopo: Test in ambiente simile alla produzione Caratteristiche:
-
Stessa configurazione della produzione
-
Stessa configurazione server (Gunicorn, Nginx)
-
Stesso comportamento di cache
-
Isolato dai dati di produzione
Vantaggio: Rileva problemi specifici della produzione prima del deployment.
Ambiente di Produzione
Scopo: Servire utenti reali Caratteristiche:
-
Ottimizzato per le prestazioni
-
Cache completa abilitata
-
Monitoraggio e allerta
-
Riavvio automatico in caso di crash
Vantaggio: Servizio stabile e affidabile.
Riferimenti
Concetti Tecnici
-
Separazione delle Competenze - Wikipedia
-
Content Delivery Network (CDN) - Wikipedia
-
Scalabilità Orizzontale - Wikipedia
-
Similarità Coseno - Wikipedia
Servizi AWS
-
CloudFront - Documentazione CDN AWS
-
S3 - Documentazione object storage AWS
-
DynamoDB - Documentazione database NoSQL AWS
Articoli Correlati
-
Architettura Servizio di Ricerca - Dettagli servizio di ricerca standalone
-
Strategia Embedding SEO - Perché usiamo all-mpnet-base-v2
-
Corrispondenza Prodotti SEO - Come funziona la ricerca vettoriale
-
Sistema di Traduzione - Architettura supporto multilingua
Riepilogo
La nostra architettura multi-server separa le competenze su server specializzati:
Server ERP di Produzione:
-
Sistema di gestione interno
-
Uptime 24/7
-
Storage condiviso ed email
Server Sito Web Pubblico:
-
Sito web rivolto ai clienti
-
Uptime 24/7
-
Dietro CDN con file statici su S3
Server di Sviluppo/Staging:
-
Ambienti di test sicuri
-
Elaborazione campagne email
-
Ottimizzato sui costi (si spegne di notte/nei weekend)
Server Servizio di Ricerca:
-
Ricerca per similarità vettoriale
-
Estrazione filtri
-
Embeddings basati su NumPy
Server Cache (Valkey):
-
Cache embeddings delle query
-
Indici vettoriali RediSearch
-
Classificazione query popolari
Vantaggi Chiave:
-
✅ Isolamento risorse: Nessuna contesa tra carichi di lavoro
-
✅ Scalabilità indipendente: Scala solo ciò che serve
-
✅ Isolamento guasti: I guasti non si propagano a cascata
-
✅ Sicurezza deployment: Testa prima della produzione
-
✅ Ottimizzazione costi: Istanze dimensionate correttamente, pianificazioni spegnimento
-
✅ Prestazioni: Cache CDN, strategie di storage specializzate
Questa architettura ci permette di servire milioni di richieste mantenendo alta disponibilità, bassa latenza e costi gestibili.