2014-07-10 11 views
17

Ho letto alcuni articoli sull'architettura dei microservizi, ma nessuno prende l'argomento della transazione. Tutto ciò che dicono che questo è difficile da fare. Forse qualcuno può descrivere come gestirlo?Transazioni nei microservizi

Ma non dal lato dominio, ma dal lato tecnologia. Diciamo che abbiamo casi aziendali in cui dobbiamo invocare due servizi diversi ed entrambi apportano alcune modifiche al database. Ma come eseguire il rollback se si verifica qualche errore sul secondo?

Chi conosce alcune librerie o modelli di progettazione per questo problema?

risposta

4

Il design migliore è avere servizi isolati: ogni servizio svolge il proprio lavoro all'interno della propria transazione e il proprio flusso di lavoro si aspetta errori nel singolo servizio.

Se è davvero necessario eseguire il commit solo se tutti i servizi sono chiamati senza errori, è necessario creare un servizio di livello superiore che esegua tali chiamate all'interno di una transazione esterna.

+1

Cosa intendi:> devi creare un servizio di livello superiore – KirkoR

+1

Voglio dire che dovresti avere un altro servizio che inizializzerà una transazione globale e chiama i tuoi altri servizi utilizzando questa transazione per eseguire il commit/rollback in base al risultato di tutte le tue chiamate. Non so come questo risultato possa essere raggiunto esattamente, dipende dalle tecnologie che stai usando. Penso che questo articolo possa fornire alcune informazioni utili (http://docs.oracle.com/cd/E17904_01/web.1111/e13734/transaction.htm). Anway, come detto prima, è un contesto davvero difficile e sarebbe molto meglio usare le singole transazioni per ogni servizio. – davmcpaul

+0

Qui puoi trovare un utile esempio di come viene affrontato il tuo problema: http://www.eaipatterns.com/ramblings/18_starbucks.html – davmcpaul

9

Potrei non essere l'ultimo esperto in questo, ma sono sicuro che ti stai dirigendo verso le Transazioni Distribuite . Per farli funzionare, tutti i componenti del servizio applicativo necessitano di un ID di transazione condivisa comune, e devi assicurarti che ogni componente sia informato sullo stato della transazione. È asincrono, quindi avrai bisogno di competenze prog avanzate.

transazioni Qui sono distribuite ricordato né trattato:

https://en.wikipedia.org/wiki/Distributed_transaction

http://contino.co.uk/microservices-not-a-free-lunch/

http://martinfowler.com/articles/microservices.html

Sembrerebbe persone cercano di evitare così com'è difficile. Forse è per questo che non trovi molto.

Spero che questo aiuti un passo in avanti :-)

0

Basandosi sulla cima della risposte precedenti, le transazioni distribuite sono la soluzione. Secondo me non vuoi costruire i tuoi meccanismi per tracciare lo stato transazionale globale, piuttosto vuoi usare qualche tipo di prodotto - ce ne sono diversi là fuori. Ho scritto un articolo del blog lungo circa la risoluzione di questo problema con un server di applicazioni Java:

http://blog.maxant.co.uk/pebble/2015/08/04/1438716480000.html

0

commit a due fasi può essere option.Coordinator inviare richiesta di commit messaggio a cohorts.Cohorts rimandano ok.After allora coordinatore invia un messaggio di commit alle coorti. Se un errore si verifica, il coordinatore invia i messaggi di rollback alle coorti.

2

La prima cosa prima, che mi è venuta in mente dopo aver letto questa domanda è quello di creare ogni aggiungere api con un eliminare API con, consente di dire, un extra booleano bandiera delFlag.

booleano flag delFlag;

Per POST, sarà 0. Per DELETE, sarà 1.

Ora gestisci un gestore delle transazioni che è un super servizio per tutti i tuoi micro servizi. In questo servizio viene mantenuta la coda di chiamata di tutti i servizi e le API. Come e quando un servizio fallisce, prendi l'api chiamante e chiama il metodo delete di quel servizio e disfa quello che hai fatto.

PS- Solo un pensiero grezzo. Correggimi se pensi che sia sbagliato

0

È possibile utilizzare un motore di workflow (come JBPM, Activiti) per orchestrare la logica e gestire gli errori di transazione o le transazioni di compensazione in esso per ottenere l'integrità dei dati. Questo è il caso analogo utilizzato nell'architettura SOA con ESB, BPMN e servizi Web