Sulla base di ciò che ho capito sull'eventuale coerenza, tutti questi servizi (consumatori) riceveranno l'evento contemporaneamente e li elaboreranno separatamente , il che, in un buon scenario, porterà alla coerenza dei dati.
No, non necessariamente. Come ho commentato, non possiamo annullare un'e-mail inviata, quindi abbiamo ancora bisogno di una sorta di "sequenza". L'IPC sulla gestione dei dati basata sugli eventi non è esente dall'orchestrazione 1 .
Ad esempio, l'e-mail non deve essere inviata a meno che le transazioni precedenti non vengano completate correttamente e il servizio e-mail non ne ottenga una prova. 3
Tuttavia, cosa succede se un servizio non riesce a elaborare l'evento? ad es. disconnessione improvvisa, errore del database, ecc ... Qual è un buon modello / pratica per gestire questi errori di transazione?
Saluta gli errori del calcolo distribuito . Sono ciò che rende le cose complicate e, come al solito, non ci sono proiettili d'argento per affrontarle.
Prima di iniziare il nostro viaggio alla ricerca dell'Arca perduta, dobbiamo considerare di chiedere prima all'organizzazione. Spesso, la soluzione sta nel modo in cui l'organizzazione affronta questi problemi nel mondo reale .
Cosa fanno tutti (dipartimenti) quando alcuni dati mancano o sono incompleti?
Arriveremo a capire che dipartimenti diversi hanno soluzioni diverse che, nel complesso, comprendono la soluzione da implementare.
Comunque, ecco alcune pratiche che potrebbero aiutarci con la strategia da seguire.
Piuttosto che garantire che il sistema sia costantemente in uno stato coerente, invece possiamo accettare che il sistema lo otterrà ad un certo punto in futuro. Questo approccio è particolarmente utile per operazioni commerciali di lunga durata.
Il modo in cui il sistema raggiunge la coerenza varia da sistema a sistema. Potrebbe comportare processi automatizzati a qualche tipo di intervento umano. Ad esempio, il tipico riprovare più tardi o il contatto con il servizio clienti .
Annullare tutte le operazioni
Riporta il sistema in uno stato coerente tramite transazioni compensative . Tuttavia, dobbiamo tenere conto del fatto che anche queste transazioni possono fallire, il che potrebbe portarci a un punto in cui è ancora più difficile risolvere l'incongruenza. E, ancora una volta, non possiamo annullare un'e-mail inviata.
Per un numero basso di transazioni, questo approccio è fattibile, perché anche il numero di transazioni compensative è basso. Se nell'IPC fossero coinvolte diverse transazioni commerciali, gestire una transazione di compensazione per ciascuna di esse sarebbe una sfida.
Se andiamo a compensare le transazioni , troveremo che il modello di progettazione dell'interruttore sia molto utile - e obbligatorio oserei dire -
Transazioni distribuite
L'idea è quella di estendere più transazioni all'interno di una singola transazione, attraverso un processo di governo generale noto come Transaction Manager . Un algoritmo comune per la gestione delle transazioni distribuite è il commit in due fasi .
La preoccupazione principale delle transazioni distribuite è che si affidano al blocco delle risorse durante la sua vita e, come sappiamo, le cose possono andare male anche per il Transaction Manager .
Se i Transaction Manager vengono compromessi, possiamo finire con diversi blocchi in tutti i diversi contesti limitati, con conseguenti comportamenti imprevisti dovuti all'accodamento dei messaggi. 2
Operazioni di decomposizione. Perché?
Se stai decomponendo un sistema esistente e trovi una raccolta di concetti che vogliono davvero essere all'interno di un singolo limite di transazione, forse lasciali fino all'ultimo.
Sam Newman
In linea con gli argomenti di cui sopra, Sam - nel suo libro Building Microservices - afferma che, se davvero, davvero non possiamo permetterci l'eventuale coerenza, dovremmo evitare di dividere l'operazione ora.
Se non possiamo permetterci di suddividere determinate operazioni in due o più transazioni, si potrebbe dire che, probabilmente, queste transazioni appartengono allo stesso contesto limitato o, almeno, a un contesto trasversale che rimane da modellare.
Ad esempio, nel nostro caso, ci rendiamo conto che le transazioni n. 1 e n. 2 sono strettamente correlate tra loro e probabilmente entrambe potrebbero appartenere allo stesso contesto limitato Conti , utenti , registro , qualunque cosa ...
Considerare di collocare entrambe le operazioni entro i limiti della stessa transazione. Renderebbe l'intera operazione più semplice da gestire. Inoltre pesa il livello di criticità di ogni transazione. Probabilmente, se la transazione n. 2 fallisce, non dovrebbe compromettere l'intera operazione. In caso di dubbi chiedere all'organizzazione .
1: Non il tipo di orchestrazione che pensi. Non sto parlando dell'orchestrazione di ESB. Sto parlando di far reagire i servizi all'evento corretto.
2: Potresti trovare interessanti opinioni di Sam Newman riguardo alle transazioni distribuite.
3: Dai un'occhiata alla risposta di David Parker su questo argomento.