Qual è il modo migliore per ottenere la coerenza del DB nei sistemi basati su microservizi?Compatibilità del DB con i microservizi
Allo GOTO in Berlin, Martin Fowler parlava di microservizi e una "regola" che menzionava era di mantenere i database "per servizio", il che significa che i servizi non possono connettersi direttamente a un DB "di proprietà" di un altro servizio.
Questo è super-bello ed elegante, ma in pratica diventa un po 'complicato. Si supponga di avere un paio di servizi:
- un frontend
- un servizio-gestione degli ordini
- un servizio di fedeltà programma
Ora, un cliente effettua un acquisto sul frontend, che chiamerà il servizio di gestione degli ordini, che salverà tutto nel DB - nessun problema. A questo punto, ci sarà anche una chiamata al servizio di programma fedeltà in modo che crediti/addebiti punti dal tuo account.
Ora, quando tutto è sullo stesso server DB/DB diventa tutto facile poiché è possibile eseguire tutto in un'unica transazione: se il servizio del programma fedeltà non riesce a scrivere nel DB, è possibile eseguire il rollback dell'intero processo.
Quando eseguiamo operazioni DB su più servizi, ciò non è possibile, poiché non facciamo affidamento su una connessione/approfittiamo dell'esecuzione di una singola transazione. Quali sono i modelli migliori per mantenere le cose coerenti e vivere una vita felice?
Sono abbastanza ansioso di sentire i vostri suggerimenti! .. e grazie in anticipo!
Cose come BPEL Engines o gestori di transazioni distribuite possono essere utilizzate per assicurare un'eventuale coerenza tra tutti i sistemi che vengono orchestrati all'interno di una transazione commerciale. Ho scritto un articolo sul blog: http://blog.maxant.co.uk/pebble/2015/08/04/1438716480000.html e se si sta eseguendo in ambiente Java, c'è un adattatore JCA che è possibile utilizzare qui: https://github.com/maxant/genericconnector –