Quando un sito ha tanti server, deve decidere quale computer risponde a ogni utente. Il trucco: mettere server e utenti su un cerchio.
Ogni utente va al primo server che trova girando come le lancette. Se un server si spegne, cambiano casa solo i suoi utenti.
Prova tu: qui sotto si tocca tutto.
Gli stessi 48 utenti, divisi in due modi. A sinistra il modo più semplice: si fa una divisione e il resto dice a quale server deve essere assegnato.
A destra il cerchio.
Premi i bottoni: aggiungi e togli server!
Ogni pallina piccola (un utente, un dato) va al primo server che incontra girando in senso orario.
Tocca un punto vuoto per aggiungere una pallina. Tocca un server per spegnerlo.
Poi sposta il cursore “punti per server”: ogni server compare in più punti del cerchio e il lavoro si divide in modo più giusto.
Ogni barra è il pezzo di cerchio di quel server: più è lunga, più utenti riceve. L'ideale è che siano tutte uguali.
Ogni pallina è una richiesta, del colore dell'utente che la manda. Il bilanciatore al centro (in inglese load balancer) sceglie il server.
“A turno” e “Casuale” mandano lo stesso utente ogni volta in un posto diverso, e il server non lo riconosce.
Con il cerchio ogni utente torna sempre dallo stesso server. Tocca un server per spegnerlo.
Il server si ricorda le cose dell'utente: il carrello, la chat. Se la volta dopo l'utente finisce su un altro server, quelle cose non ci sono.
Con il cerchio si spostano solo i suoi utenti, sul server successivo. Gli altri non se ne accorgono.
“A turno” divide il lavoro in parti perfette ma non riconosce nessuno. Il cerchio riconosce tutti e, con tanti punti per server, divide bene anche il lavoro.
Finora ogni chat aveva un solo server. Nei livelli avanzati il sistema diventa prudente: tiene dei server di riserva, si ricorda le risposte già calcolate e sta alla larga dai server in affanno. Tre prove, una per idea.
La chat va sempre al primo server in senso orario: è il principale. Poi si continua a girare per trovare le riserve, da usare se il principale si rompe.
Nel codice: assign_servers(chat_id, k=3, min_free_ram_mb) e update_server_ram.
Tocca un server per cambiare la sua RAM libera.
Calcolare principale e riserve costa un giro del cerchio. Per le chat che tornano spesso, la risposta si tiene da parte in una cache: un cassetto con pochi posti.
_epoch) e si butta tutto.Nel codice: OrderedDict, con move_to_end e popitem(last=False).
La RAM libera di un server sale e scende di continuo. Se la regola fosse solo “sotto la soglia: evitalo”, il server entrerebbe e uscirebbe dalla lista decine di volte.
Nel codice: set_ram_thresholds(min, hysteresis_mb), record_server_failure e una deque.
Tengono i dati su tante macchine. Il cerchio decide dove va ogni dato; se si aggiunge una macchina, si sposta solo una piccola parte dei dati.
Ogni pagina web viene tenuta pronta sempre sullo stesso server, così arriva subito. Se quel server si spegne, si perdono solo le sue pagine.
Chi è collegato a lungo (una chat, un gioco online) resta sullo stesso server: è la simulazione qui sopra.
Ogni conversazione resta sul server che se la ricorda. Altro esempio: gli ordini di un servizio di delivery con i rider distribuiti sul cerchio.