Consistente? De-normalizzazione, consistenza eventuale e assenza di transazioni, perché sono un vantaggio e non un problema.
Mauro Servienti Managed //milestone.topics.it //blogs.ugidotnet.org/topics RavenDB trainer NServiceBus trainer/support Microsoft MVP – Visual C#
DEFINIZIONI Cominciamo con il metterci d’accordo sull’argomento
Consistenza è il grado di accordo tra le parti che guardano uno stesso sistema in un dato momento T più le parti concordano su quello che vedono più il sistema è consistente
Accoppiamento è il grado di interdipendenza tra le parti più il cambiamento di una parte impatta sulle altri più il sistema è accoppiato
Accoppiamento temporale è una forma specifica di accoppiamento più la non disponibilità di una parte impatta sulle altre più il sistema è accoppiato
ABBIAMO UN PROBLEMA?
Contesto e requisiti È fondamentale identificare il contesto; senza contesto i problemi sono aria fritta; I requisiti determinano i confini del problema ma ancora di più della soluzione; Una soluzione è valida quando è validata dai requisiti altrimenti è inutile sovra- ingegnerizzazione;
Un esempio teorico Single Picker per Batch Multiple Picker per Batch
IL REQUISITO
e-commerce Abbiamo un “piccolo” portale di e-commerce che sta rapidamente crescendo e vogliamo: – Migliorare i tempi di risposta del portale; – Dare in out-sourcing la gestione delle spedizioni; – Espandere il nostro business ad altri paesi extra europei;
TEMPI DI RISPOSTA Diamo per scontato che abbiamo identificato il problema e non è il nostro codice
Sharding e Replica Se il database va piano la prima cosa da guardare è l’hardware, fine, spesso un buon SSD risolve tutti i problemi con un impatto nullo sull’architettura; Se un SSD non basta Sharding e Replica sono l’unica vera soluzione, soluzione drastica e dolorosa;
E le transazioni? Non è più pensabile a questo punto fare in una singola passata (aka Commit): – Modifica del carrello; – Checkout; – Creazione dell’ordine; – Creazione della spedizione “Banalmente” potrebbero essere su database diversi;
OUT-SOURCING DELLE SPEDIZIONI
Accoppiamento Store Front End Shipping Service
Accoppiamento #2 L’accoppiamento con un servizio è molto pericoloso, a prescindere: – Leghiamo due componenti che nonostante siano sotto il nostro controllo non possiamo garantire essere disponibili nello stesso momento; L’accoppiamento con un servizio esterno, non sotto il nostro controllo è un suicidio: – Non abbiamo neanche lontanamente la possibilità di garantire nulla;
ESPANSIONE DEL BUSINESS
…e le time-zone? Ci espandiamo dall’Europa verso agli Stati Uniti e il nostro concetto di alta disponibilità cambia drasticamente: – Passiamo da 3 fusi orari a 12 – La finestra temporale in cui possiamo essere offline è ridotta all’osso È un problema sia di affidabilità ma anche di deploy
Accoppiamento temporale La distruzione geografica di un monolite è impossibile, comporta l’impossibilità di evolvere il monolite; – Oltre a tutti i problemi di cui già abbiamo parlato; L’alta disponibilità su un range orario ampio è possibile solo se non abbiamo dipendenza “temporale” tra le parti; – Naturalmente non va d’accordo con un’architettura tradizionale;
IL MODELLO MENTALE DELL’UTENTE
Mettiamoci in testa che… noi, dev, non siamo la soluzione di un bel nulla, siamo lo strumento per raggiungere la soluzione -- Non siamo pagati per inventare iperboliche soluzioni ma per risolvere problemi
Una strana realtà… Arriva un ordine; l’azienda si blocca perché stiamo processando l’ordine finché non abbiamo capito se le giacenze a magazzino sono in grado di soddisfare il nuovo ordine; La produzione nel frattempo è sospesa perché deve capire come pianificare il nuovo ordine che però in coda per le giacenze che sono bloccate da un pick della produzione che è ferma…
DEADLOCK
La realtà… L’ovvia e unica conseguenza di scalare un monolite lasciandolo un monolite è il collasso del sistema; La realtà: – Non sa cosa sono le transazioni; – Ha un bassissimo, se non nullo, accoppiamento tra le parti; – Non ha accoppiamento temporale;
Non è proprio così vero… All’interno di un’azienda è pensabile che: – Ci sia accoppiamento in un reparto/OU; – Ci sia accoppiamento temporale tra alcune parti Produzione e magazzino materie prime – C siano all’interno di un reparto alcune operazioni che devo essere coordinate da un supervisore (DTC)
ALL’INTERNO DI UN REPARTO…
BOUNDED CONTEXT
Bounded Context e Ubiquitous Language Due dei concetti più snobbati da chi pratica DDD; L’unico vero modo per trasformare il monolite in tante piccole parti che parlano tra di loro con: – Basso accoppiamento (nullo è impossibile); – Nessun accoppiamento temporale; – In maniera eventualmente consistente
EVENTUALMENTE CONSISTENTE
Torniamo alla nostra azienda… Chiediamo ad un manager lo stato di avanzamento di una commessa – dove la produzione è conto terzi in Malesia La risposta: – A ieri alle 5 la situazione era…bla bla…non so ancora nulla di XYX perché arriva dagli Stati Uniti e iniziano a lavorare far 6 ore, ti aggiorno stasera;
Il grado di accordo tra le parti Diventa molto basso; Ogni comunicazione deve portare con se la versione (a ieri alle 6) consentendoci di discernere e mettere in ordine eventuali comunicazioni multiple; Le parti sono però libere di “muoversi” come vogliono: – Evolvere perché l’accoppiamento è basso; – esserci/non esserci perché l’accoppiamento temporale non esiste;
E LE TRANSAZIONI?
Ci servono ancora? All’interno del nostro orticello (BC) perché no? In base alla tecnologia di persistenza potremmo essere obbligati ad usarle; Cross-BC assolutamente no; Se modelliamo la realtà non ci interessa più essere consistenti (fully) ma ci basta essere certi che prima o poi lo saremo;
La posta e il postino Una mail è consistente? No; Il nostro rapporto con il server di posta è consistente? Si; Il rapporto tra i singoli server SMTP è consistente? Si; Il rapporto tra l’ultimo server e la mailbox del destinatario è consistente? Si;
L’intero sistema è consistente? No Ci da però delle garanzie: – Ogni singolo passaggio è consistente; – Se un passaggio fallisce avremo, con la stessa logica, indietro un’informazione che la nostra richiesta è fallita; Abbiamo bisogno delle transazioni distribuite? No;
EVENTUALMENTE CONSISTENTE -- DEMO