Ciao, e benvenuto nella quinta puntata della settantunesima stagione. Oggi tocchiamo il tema che, più di ogni altro, separa chi ha una vaga idea dei sistemi distribuiti da chi li capisce davvero. Ed è anche la puntata più onesta, quella dove smontiamo un desiderio che tutti abbiamo: avere i nostri dati dappertutto, sempre uguali, sempre disponibili, e senza mai un problema. È un desiderio bellissimo. Ed è, in parte, impossibile.
Partiamo dal perché teniamo più copie degli stessi dati, perché non è un capriccio. Le copie servono per due dei motivi che conosciamo. Servono per sopravvivere ai guasti: se il dato è in un posto solo e quel posto brucia, il dato è perso; se ne hai tre copie in tre posti, ne puoi perdere una e stare tranquillo. E servono per la velocità: se hai utenti in tutto il mondo, tenere una copia dei dati vicino a ciascuno di loro rende tutto più rapido, invece di far attraversare il pianeta a ogni richiesta. Tenere copie, quindi, è saggio e spesso indispensabile. Il problema nasce subito dopo.
Vediamo il problema, che è tanto semplice da enunciare quanto profondo. Se hai tre copie dello stesso dato e qualcuno lo modifica, in quell'istante le tre copie non sono più uguali: una è aggiornata, due sono ancora vecchie. Devi propagare la modifica alle altre. Ma propagare vuol dire mandare messaggi sulla rete, e la rete, lo sappiamo, ritarda e perde. Quindi per un intervallo di tempo, breve o lungo che sia, le tue copie raccontano verità diverse. Chi legge dalla copia aggiornata vede il nuovo valore; chi legge da una vecchia vede ancora quello di prima. Lo stesso dato, in due posti, dice due cose diverse nello stesso momento.
Nota che questo apre una scelta di fondo, e non c'è modo di evitarla. Da un lato puoi pretendere la coerenza forte: quando qualcuno modifica un dato, non consideri la modifica finita finché tutte le copie non sono aggiornate e d'accordo. Chi legge, ovunque, vede sempre lo stesso valore. Pulito, rassicurante, ma lento e fragile: devi aspettare tutte le copie, e se una è irraggiungibile ti blocchi. Dall'altro lato puoi accontentarti della coerenza debole: accetti che le copie, per un po', siano disallineate, sapendo che col tempo si riallineeranno. Veloce e robusto, ma con la scomodità che due persone, nello stesso istante, possono vedere dati diversi. Non c'è una scelta giusta in assoluto: c'è quella adatta a cosa stai facendo.
E qui la parte davvero onesta, quella che devi conoscere. Ci sono casi in cui il disallineamento temporaneo è del tutto innocuo, e altri in cui è un disastro. Se due persone vedono per qualche secondo un numero di like leggermente diverso sotto un post, non muore nessuno: la coerenza debole va benissimo, e ti prendi la velocità. Ma se due sportelli, nello stesso istante, vedono lo stesso conto in banca come pieno e permettono entrambi un prelievo, hai un problema serio: lì ti serve la coerenza forte, e paghi il suo prezzo volentieri. Il mestiere non è scegliere la coerenza migliore, che non esiste: è capire, per ogni singolo dato, quanto disallineamento puoi tollerare.
C'è poi il momento che rende tutto ancora più crudo, ed è quando la rete si spezza mentre stai aggiornando. Hai modificato la copia di Roma, ma la linea con Milano cade prima che la modifica arrivi. Adesso Roma e Milano hanno valori diversi, e non possono nemmeno parlarsi per rimettersi d'accordo. Cosa fai? Blocchi tutto finché la linea non torna, per non dire bugie a nessuno? Oppure lasci che ognuna vada avanti per conto suo, accettando che diranno cose diverse? Qualunque cosa scegli, rinunci a qualcosa. È il cuore duro dei sistemi distribuiti, e sarà il tema esplicito di una prossima puntata.
Voglio lasciarti con il modo giusto di guardare le copie, perché cambia tutto. Non pensare mai ai dati replicati come a una cosa sola che sta magicamente in più posti. Pensali per quello che sono: tante copie separate, ognuna con la sua storia, che si rincorrono a fatica lungo una rete lenta. La coerenza perfetta, quella dove tutte le copie sono sempre identiche in ogni istante e sempre disponibili, è un'illusione che regge solo finché la rete è perfetta, cioè mai. La bravura non sta nel pretendere quell'illusione, ma nel decidere con lucidità, dato per dato, quanta verità sei disposto a vedere sfasata in cambio di velocità e resistenza.
Per oggi ci fermiamo qui. Abbiamo aperto il capitolo più delicato: teniamo copie dei dati per sopravvivere ai guasti e per essere veloci ovunque, ma nell'istante in cui modifichi una copia le altre diventano vecchie, e propagare l'aggiornamento significa fidarsi di una rete lenta. Da qui la scelta di fondo: coerenza forte, dove tutte le copie concordano sempre ma sei lento e fragile, o coerenza debole, dove sei veloce e robusto ma per un po' le copie dicono cose diverse. Non c'è la migliore: c'è quella adatta al dato, e alcuni disallineamenti sono innocui, altri catastrofici. E quando la rete si spezza a metà aggiornamento, qualunque scelta ti costa qualcosa. Nella prossima puntata: mettersi d'accordo. Nelle note trovi qualche spunto. Se ti è utile, condividila. Grazie per l'ascolto, e ci sentiamo alla prossima.