Uno dei principali principi di progettazione del servizio SOA è il principio di Composibilità del servizio ( https://en.wikipedia.org/wiki/Service_composability_principle ).
L'idea è che componendo nuovi servizi utilizzando quelli esistenti come elementi costitutivi, è possibile sviluppare rapidamente nuovi servizi. In modo analogo al modo in cui chiamate metodi esistenti di oggetti quando implementate nuovi metodi. È da qui che dovrebbe derivare gran parte dell'aumento della produttività della SOA.
Qualcuno lo fa davvero in pratica? L'ho visto ripetutamente all'infinito nel testo scritto, ma non ho sperimentato di persona l'implementazione del mondo reale. La maggior parte del testo omette anche qualsiasi menzione della gestione delle transazioni , che mi sembra essere il maggiore ostacolo nella realizzazione di servizi compostabili.
Innanzitutto, è davvero necessario affrontare il problema delle transazioni prima di poter comporre qualsiasi servizio non banale. Certo, se l'esempio ha i servizi "findCurrentTime ()" e "writeLogMessage ()" è facile non preoccuparsi delle transazioni, ma non quando si hanno esempi del mondo reale come "depositMoney ()" e "drawMoney () ".
Conosco due opzioni:
- Implementare transazioni reali con WS-Atomic Transaction o simili
- Implementare una soluzione basata sulla compensazione che compensi la chiamata ad A con "cancelA ()" o qualcosa del genere se la chiamata a B fallisce
Entrambi mi sembrano molto problematici / quasi inutilizzabili per me:
- Transazione WS-Atomic
- un sacco di complessità, maggior parte dei consigli che ho trovato appena avverte "spina nel fianco, non lo fate"
- il supporto è limitato, ad esempio se si utilizzano ESB open source, le principali alternative ServiceMix, Mule o WSO2 non lo supportano
- compensazioni
- l'implementazione della gestione dei compensi mi sembra molto complessa. Cosa facciamo se il servizio A ha esito positivo e non riceviamo mai una risposta dal servizio B e non sappiamo se ha fallito o è riuscito? Gestire tale logica manualmente (come implementatore di servizi di composizione) mi fa venire voglia di tagliarmi i polsi - questo è il tipo di lavoro che uno strumento dovrebbe fare per me !.
- Inoltre, non vedo come si possano avere metodi di compensazione in servizi non banali. Supponi che il tuo servizio A sia "depositMoney ()" e che abbia successo, qualche altra azione trasferisce rapidamente i soldi altrove, e quindi riceviamo "compensateDepositMoney ()", cosa facciamo ora? Sembra una grande lattina di vermi.
A mio avviso , la composizione dei servizi è un principio SOA così fondamentale che non si ottengono realmente i vantaggi della SOA se non è possibile (convenientemente) comporre servizi . Qual è la realtà? Il 90% degli utenti di SOA utilizza "criplled SOA" senza una vera e propria consulenza di servizio? O la maggior parte degli utenti utilizza effettivamente la composizione del servizio e sto esagerando la sua difficoltà?