MokaByte 95 - Aprle 2005 
Uno sguardo su SOA
di
Raffaele
Spazzoli
L'integrazione delle applicazioni sembra essere un tema dell'informatica perennemente caldo ed irrisolto.
Negli anni '90 si è cercato di risolvere questo problema con gli ERP, si è tentato cioè di avere un'unica applicazione che coprisse tutti i requisiti del sistema informativo. Questo approccio man mano che i sistemi informativi sono divenuti più complessi è fallito perché è emerso il fatto che nei sistemi Enterprise una applicazione difficilmente riesce a coprire più del 40 percento delle necessità funzionali. A fine anni '90 e inizio 2000 le applicazioni web a tre livelli, che dovevano distribuire i servizi aziendali in internet con un unico front-end, hanno acuito il problema e messo in evidenza l'inadeguatezza delle tecniche attuali. In entrambi i casi sopra citati qualche azienda ha scelto la strada dei sistemi asincroni a messaggi ottenendo buoni risultati, ma senza comunque risolvere completamente il problema dell'integrazione. Oggi sembra essere la volta di SOA. In questo articolo si darà un breve introduzione di questo stile architetturale.

Modalità di integrazione
Gartner [GARTNER] divide i modi in cui si possono integrare le applicazioni in tre casistiche fondamentali:

  • Data consistency
  • Multistep Process
  • Composite Application

descriviamole brevemente.

Data consistency
L'obiettivo di questa tecnica è quella di tenere allineati i database di una o più applicazioni sui fatti rilevanti per l'azienda. La caratteristica principale di questa tecnica è che le applicazioni sono logicamente e fisicamente indipendenti perché le sincronizzazioni fra due applicazioni avvengono in processi separati e in maniera indipendente da quello che sta facendo l'applicazione.
Questo pattern di integrazione (vedi figura 1) di fatto viene implementato da processi batch. In genere si parla poco dei batch, ma nei sistemi informativi enterprise essi sono tuttora un importante mezzo di integrazione e rappresentano ancora una parte rilevante delle elaborazioni.


Figura 1
- Data consistency

Multistep Process
Secondo questo pattern (vedi figura 2) una applicazione scatena un evento che è propagato attraverso le applicazioni interessate con uno o più step. La comunicazione è asincrona e monodirezionale. In questo caso le applicazioni sono fisicamente indipendenti, ma non lo sono logicamente in quanto l'elaborazione dell'evento necessita della logica di ogni applicazione che vi partecipa. Questo pattern si ha ogni volta che si costruiscono architetture asincrone a messaggi.



Figura 2 - Multistep Process

Composite Application
In questo caso una applicazione comunica in maniera bidirezionale e tipicamente sincrona con una o più applicazioni. In questo pattern (vedi figura 3) il grado di accoppiamento delle applicazioni è molto elevato, al punto che si può sostenere che nell'insieme le applicazioni così integrate vanno a comporre una nuova applicazione. Questa è la modalità di integrazione che oggi si incontra più spesso e che ha permesso a tante aziende di creare applicazioni di integrazione del loro legacy al fine di esporre le funzionalità aziendali mediante un nuovo front-end (tipicamente un'applicazione web).



Figura 3 - Composite Application

SOA
Qualunque sia il pattern di integrazione che dobbiamo usare rimane il fatto che integrare è una attività difficile e costosa. Questo induce a pensare che la difficoltà non dipenda da come si affronta il problema, ma che la difficoltà sia intrinseca all'attività di integrazione. Negli esempi visti sopra abbiamo sempre delle applicazioni complete su cui vogliamo innestare una nuova funzionalità che implica una forma di integrazione. Questo porta ad affrontare i problemi di integrazione in fase di manutenzione/evoluzione delle applicazioni. Inoltre normalmente in questi casi si tende a soluzioni particolari e poco riutilizzabili nell'eventualità di nuove necessità di integrazione.
Un miglioramento alla difficoltà del problema dell'integrazione si avrebbe se le applicazioni fossero concepite per essere integrate. Quindi se le problematiche della fase di integrazione fossero affrontate nella fase di inception dell'applicazione. Questo non elimina completamente la difficoltà di integrazione però consente di risolvere una serie di problemi nella fase di sviluppo dell'applicazione (quando cioè toccare il codice costa meno). Se l'applicazione invece esiste già si può costruire sopra di essa un layer che la mostri al mondo esterno "come se" fosse stata concepita per essere integrata.
Questa è una delle idee che stanno alla base dello stile architetturale SOA (e per me la più importante). Vedremo che il modo migliore (per quanto ne sappiamo oggi) per avere applicazioni integrabili è quello di pensarle a servizi e cercheremo di capire meglio cosa sono i servizi.
Ma SOA non è solo questo, SOA è anche una collezione di idee e best practices sul tema dell'integrazione maturate in seguito all'introduzione del modello di computazione distribuita. Ad esempio una delle best practice più importante è che disaccoppiare (ove possibile) porta molti benefici.

La figura 4 segue mostra un blueprint di un'architettura SOA. Come si può vedere esistono vari layer. Partendo dal basso abbiamo il layer delle applicazioni a servizi e il layer dell'ESB. Questi layer sono fondamentali per l'architettura SOA e saranno esaminati più in dettaglio in seguito. Gli altri layer invece elevano via via il livello di astrazione permettendo di avvicinare gli aspetti tecnici di in sistema informativo a chi dirige il business di una azienda. Infatti il layer del workflow consente di disegnare e configurare workflow di processi aziendali (piuttosto che cablare queste informazioni nelle applicazioni come spesso accade). Una volta che si hanno a disposizione dei processi aziendali è possibile gestirli (layer BPM: Business Process Management) cioè attivarli e disattivarli, ma anche gestire situazioni di errore mediante applicazioni di backoffice.

 


Figura 4 - Blueprint architettura SOA

Infine il layer BAM (Business Activity Monitoring) consente di analizzare le dinamiche dei processi di business al fine di prendere decisione aziendali. Gli strumenti di questi tre layer possono teoricamente essere usati da persone non tecniche (con la dovuta assistenza) e consentono di avvicinare le persone che prendono di decisioni di business al settore IT facendoglielo meglio comprendere. In effetti questi tre layer non sono nuovi e sono presenti anche nei blueprint di altri modelli architetturali. Poche aziende li hanno effettivamente realizzati. SOA grazie alla sua flessibilità dovrebbe consentire finalmente di costruire questi layer a costi accettabili, ma staremo a vedere, per il momento ritengo conveniente concentrasi sui due layer più bassi.

Implementare una architettura SOA a tappeto su un sistema informativo già in essere può significare una rivoluzione tale da rendere difficile la cosa e magari trovare anche opposizioni legittime da parte delle persone più scettiche. Come sempre nell'informatica più che rivoluzioni bisogna fare evoluzioni. Questo consente di minimizzare i rischi del cambiamento, salvaguardare gli investimenti passati e di convincere a poco a poco gli scettici. SOA non è differente da questo punto di vista e perché abbia successo va fatta partire con progetti pilota.
Quindi per la buona riuscita dell'evoluzione verso SOA da parte del management è necessario supportare e sostenere un continuo processo di rinnovo del parco applicativo mediante acquisizioni di applicazioni a servizi o conversioni delle applicazioni esistenti.

 

I servizi
Un servizio è una funzionalità di business autoconsistente. Autoconsistente significa che per usufruire della funzionalità messa a disposizione dal servizio è sufficiente chiamarlo senza dovere effettuare altre operazioni. Come già evidenziato in [PIRACCINI] queste proprietà si ottengono creando servizi stateless e di granularità piuttosto grossa.
Mentre dovrebbe essere chiaro a tutti cosa significa servizio stateless, il discorso sulla granularità fine/grossa è molto più soggettivo perché il tema è a cavallo fra il piano architetturale e quello funzionale.
Ad esempio una applicazione di CRM potrebbe esporre tre servizi come mostrato in figura 6.


Figura 5 - CRM a servizi

In questo caso i servizi sono pochi e per dare la copertura funzionale necessaria all'applicazione CRM dovranno mettere a disposizione più di una funzionalità. Ad esempio possiamo immaginare che il servizio di gestione anagrafica cliente consentirà di effettuare inserimenti, modifiche, cancellazioni e ricerche di clienti. Le applicazioni in SOA diventano quindi un substrato che riunisce assieme un insieme di servizi che hanno affinità funzionale.

 

I servizi e l'analisi
E' abbastanza evidente quindi che i servizi devono essere disegnati assieme agli esperti funzionali e di dominio. Anche per queste persone il passaggio ad una architettura SOA ha degli impatti. Infatti spesso gli analisti funzionali partono ad eseguire la loro analisi dall'interfaccia grafica (spesso chiamata mappa) che l'utente si troverà di fronte. In questa maniera il layer di business (e quindi in questo caso i servizi) viene modellato in modo da rispondere perfettamente alle necessità dell'applicazione di front-end, incernierandosi con le mappe e le navigazioni sulle mappe previste dagli analisti. Il grado di riusabilità di servizi ottenuti in questo modo è piuttosto basso, anzi in generale si può affermare che solo l'applicazione di front-end sarà in grado di utilizzare i servizi (e per essa andranno benissimo).
Il passo richiesto agli analisti funzionali è dunque quello di svincolarsi da questo modo procedere e pensare a servizi riusabili cercando di prevedere le necessità di integrazione future. Resta sottinteso ovviamente che se queste necessità non ci sono, non conviene adottare un'architettura SOA e probabilmente risulta meno costoso limitarsi ad una architettura distribuita o addirittura ad un client/server.
L'analista deve partire non più dalle mappe, ma cominciare a ragionare sull'interfaccia dei servizi, è importante dunque che esita una interfaccia esplicita e dichiarata in un documento.
Una società con cui sono in contatto e che vuole sviluppare applicazioni a servizi ha creato due gruppi uno per il layer dei servizi ed uno per il front-end e ha adottato la regola che questi gruppi possono comunicare solo mediante documenti. Questa situazione che per certi versi può sembrare estrema e che sicuramente aumenta i costi di sviluppo dell'applicazioni modella però una situazione realistica: infatti in futuro sempre più spesso ci sarà la necessità di integrare applicazioni di due società diverse che vogliono fare business assieme. In questo caso abbiamo due sistemi informativi differenti e anche due gruppi di lavoro remoti per cui è inevitabile che si instauri un processo di analisi e sviluppo basato sullo scambio di documenti.
Una interfaccia chiara e documentata che rappresenti il contratto del servizio è quindi il deliverable fondamentale della fase di analisi di un servizio.

 

I servizi e il change management
Se stiamo disegnando architetture SOA è perché vogliamo che i servizi che rendiamo disponibili siano utilizzati da più utenti possibili, magari anche esterni al nostro sistema informativo.
Questo pone dei vincoli (anche contrattuali) su come e quando il comportamento o l'interfaccia del servizio può essere cambiato, cioè pone dei vincoli sul change management. Il motivo per cui questo accade è che se si hanno molti utenti di un servizio e si deve rilasciare una nuova versione dello stesso non è possibile obbligare tutti gli utenti a fare gli adeguamenti necessari né è possibile interrompere la fornitura di servizio a chi non si adegua.
Piuttosto che affrontare il problema di caso in caso è meglio darsi delle regole generali che valgano per tutti i servizi realizzando un processo di change management su cui tutte le parti concordino. In generale il processo di change management dovrà consentire:

  • La possibilità del consumer del servizio di scegliere a quale versione del servizio agganciarsi.
  • La possibilità al provider del servizio di deprecare e successivamente dismettere vecchie versioni di un servizio.

Per raggiungere questi obiettivi è sufficiente che il sistema supporti più versioni in linea del medesimo servizio come mostrato in figura 6.



Figura 6 - Versionamento dei servizi

Ci sono doversi modi per avere due versioni del servizio in linea, ma fondamentalmente si ricade sempre in due categorie:

  • Pubblicazione del medesimo servizio con nomi diversi.
  • Unico servizio con un parametro di ingresso che indica la versione del servizio che si vuole richiamare.

I servizi possono richiamare altri servizi ad esempio nel caso si implementino sistemi di workflow. Al fine di avere un buon sistema di change management è necessario tracciare le dipendenze fra servizi in modo da essere in grado di prevedere gli impatti dovuti al cambiamento di un servizio.

 

Management e monitoring del servizio
I servizi nelle architetture SOA dovranno fornire un servizio (scusate il bisticcio di parole) conforme a certi standard di qualità (SLA Service Level Agreement) su cui le parti hanno convenuto. Possono aversi casi in cui gli SLA sono differenti per tipo di servizio, oppure per chiamante oppure cambiano a seconda dell'orario del giorno. In ogni caso deve essere possibile monitorare il comportamento dei servizi ed eventualmente avere strumenti per intervenire e quindi gestire il servizio.
L'attenzione si sposta dunque sul servizio e non è più sull'applicazione che fornisce il servizio, ad esempio una applicazione potrebbe avere servizi con SLA differenti. Inoltre dovrebbe essere possibile controllare tutti i servizi (anche di differenti applicazioni) da un'unica console.
Questo naturalmente è fattibile più agevolmente se i servizi sono disegnati in partenza per essere monitorati e gestiti.
Inoltre il servizio (e non l'applicazione nel suo complesso) deve avere un log e deve essere "auditabile" (cioè fornire un insieme di dati sufficienti alle strutture di audit ad eseguire i propri controlli). Infatti potrei avere bisogno che due servizi della medesima applicazione uno di tipo inquiry ed uno di tipo dispositivo scrivano un log di audit su due supporti separati.
Infine un servizio potrebbe essere a pagamento, in tal caso deve essere "accountabile" cioè deve essere possibile tenere traccia del chiamante e del numero delle chiamate per potere calcolare i costi.

 

Il disaccoppiamento
Una pratica su cui insiste SOA è il disaccoppiamento.
Il disaccoppiamento fra il fornitore e il consumatore del servizio è una caratteristica molto importante in una architettura di integrazione. Infatti più è alto più l'architettura è agile e gestibile, e di conseguenza a basso costo. In teoria se non vi fosse nessun accoppiamento fra consumatore e fornitore il costo di gestione del sistema sarebbe dato dalla somma del costo di gestione delle due applicazioni. Nella realtà i costi invece sono sempre maggiori perché appunto si aggiunge il costo di integrazione.
Di seguito si prendono in esame tre tipi di accoppiamento che SOA tenta di alleviare. E' probabile che se ne possano trovare altri tipi che qui non sono analizzati.

 

Accoppiamento applicativo
Questo tipo di accoppiamento si ha ogni volta che due applicazioni condividono qualche artefatto. Ad esempio se due applicazioni condividono un IDL dal quale generano gli stub e gli skeleton necessari all'erogazione del servizio esse sono accoppiate applicativamente e ogni volta che l'IDL cambia bisogna effettuare il deploy sia del fornitore che del consumatore del servizio.
Un altro esempio di accoppiamento applicativo si ha quando fornitore e consumatore si scambiano qualche oggetto durante la fase di comunicazione. E' evidente che gli oggetti scambiati che saranno i parametri e il risultato dell'elaborazione devono essere noti ad entrambe le controparti e di conseguenza se gli oggetti cambiano è necessario effettuare il deploy delle due applicazioni.
Questa tipo di accoppiamento è piuttosto diffuso oggi e anzi si può dire che è incoraggiato dagli strumenti di sviluppo odierni quali CORBA e J2EE che spingono ad usare IDL e pattern quali value object come modello di sviluppo dei servizi. La mia opinione è che gli strumenti sopra citati consentano agevolmente di rendere remote funzionalità presenti in componenti/oggetti software. Queste componenti sono però tutt'altro che servizi nel senso di SOA.
Comunque anche nel caso delle componenti il problema di gestire gli aggiornamenti rimane. Mi è capitato in un paio di esperienze di vedere il problema aggirato applicando il pattern command [J2EEPATTERN]. Mediante questo pattern si può fare sì che l'interfaccia della componente remota sia unica e fissa e che un value object che rappresenta la richiesta attuale (comando) sia scambiato avanti e indietro fra le due parti. In questo modo è possibile far svolgere più compiti allo stesso componente remoto, basta definire nuovi comandi. Inoltre introducendo nuovi comando o evolvendo quelli esistenti non si modifica l'interfaccia remota del componente quindi non è mai necessario ricompilare stub e skeleton; può dunque sembrare che questa sia la soluzione del problema dell'accoppiamento applicativo.
In realtà non è vero, infatti col pattern command da un lato l'interfaccia remota del servizio è troppo generica per rappresentare un contratto fra le due parti, dall'altro però il contratto è implicitamente e subdolamente definito dall'oggetto comando che quindi deve essere noto ad entrambe le controparti. Questo approccio scricchiola non appena i consumatori del servizio sono più d'uno e magari sono esterni al sistema informativo del fornitore del servizio. In questo scenario (che è lo scenario in cui nasce SOA) c'è bisogno di una maggiore formalizzazione del contratto e inoltre come abbiamo già detto di una oculata gestione degli aggiornamenti.
Per limitare l'accoppiamento applicativo SOA propone che le applicazioni mantengano invariata la propria rappresentazione dei dati senza quindi avere oggetti in comune. Per fare ciò una possibilità è, come mostrato in figura 7, che le applicazioni serializzino i dati in un messaggio in un formato che sia trasformabile facilmente da un ente intermedio.

 


Figura 7 - Accoppiamento applicativo

Nell'esempio mostrato in figura l'applicazione mutui effettua una richiesta che contiene l'oggetto cliente all'applicazione CRM. La richiesta però viene serializzata in un messaggio in un formato che sia facilmente trasformabile. La trasformazione avrà il compito di rendere la richiesta interpretabile dall'applicazione CRM. In questo modo l'applicazione mutui e CRM non condividono nulla di applicativo.
XML e XSLT sono naturalmente oggi i candidati ideali per effettuare queste operazioni, ma l'idea del disaccoppiamento applicativo rimane al di là della scelta di queste tecnologie. Soluzioni più evolute possono prevedere la presenza di un dizionario dati che dinamicamente configuri la trasformazione da effettuare.

 

Accoppiamento tecnologico
L'accoppiamento tecnologico si ha quando due applicazioni devono condividere qualche aspetto tecnologico per funzionare correttamente. Per esempio se due applicazioni devono essere sviluppate con J2EE o devono avere il runtime CORBA dello stesso vendor allora sono accoppiate tecnologicamente.
Nello sviluppo di un sistema informativo SOA non devono esservi vincoli che generino accoppiamenti tecnologici. Quindi in teoria SOA ammette la coesistenza di qualunque tecnologia.
In generale è bene limitare all'interno di un sistema informativo le tecnologie usate (per i vari aspetti ad esempio: DBMS, S.O., protocolli di comunicazione) assestandosi su due o tre tipi. Un numero maggiore provoca costi di amministrazione e formazione troppo elevati.
Ma anche l'omogeneità tecnologica totale può avere degli svantaggi: per prima cosa ottenerla su un sistema già avviato può essere molto costoso; inoltre la possibilità di ospitare più di una tecnologia in un sistema informativo, in caso di acquisto di nuove applicazioni consente di esaminare più candidati e quindi potere scegliere sempre il prodotto migliore. Infine avere più di una tecnologia consente di mettere in competizione i fornitori di questa tecnologia e quindi in generale di abbassare i prezzi delle licenze (bisogna essere bravi per riuscirci, ma si può fare).

 

Accoppiamento temporale
Due applicazioni sono accoppiate temporalmente se è necessario che siano entrambe online affinché una delle due possa funzionare correttamente. Può sembrare impossibile che se due applicazioni sono integrate una delle due possa funzionare correttamente se l'altra non è online. Invece è possibile realizzare quatta situazione adottando protocolli di comunicazione asincrona e monodirezionale. Se teniamo a mente i pattern di integrazione già citati solo nel caso delle composite application non riusciamo a disaccoppiare temporalmente le applicazioni, negli altri casi è possibile.
Si noti che se il pattern di comunicazione è sincrono (cioè di tipo richiesta risposta) non importa quale protocollo di comunicazione usiamo, il risultato sarà sempre che le applicazioni sono accoppiate temporalmente. Anche se, come mostrato in figura 8, usiamo protocolli asincroni per esempio una coda di messaggi per la richiesta e una coda di messaggi (con correlazione) per la risposta, le applicazioni rimangono sempre temporalmente accoppiate.


Figura 8 - Accoppiamento temporale

 

Layer dell'architettura SOA
Come nelle architetture distribuite è possibile distinguere facilmente alcuni layer (tipicamente dati, business, presentation) la stessa cosa si può fare per le architetture SOA.


Figura 9 - Layer architettura SOA

I layer che si possono individuare sono mostrati in figura 9 e sono i seguenti:

  • Layer delle applicazioni SOA
  • Layer tecnologico e di normalizzazione
  • Layer di composizione dei processi
  • User end point layer

I nomi dei layer SOA sono liberamente tratti da [ENTERPRISESOA] e non sono standard (per la verità non è ancora stato sviluppato un lessico ufficiale per indicare i layer SOA).

 

Layer delle applicazioni SOA
In questo layer ci sono le applicazioni che espongono i servizi con le caratteristiche di cui si è parlato precedentemente.
Come già detto le applicazioni possono esporre servizi sia perché sono state concepite a servizi sia perché sono state wrappate con qualcosa che le mostra "come se" fossero state concepite a servizi.
Come si può vedere dalla figura le applicazioni a servizi non hanno legami esterni se non mediante servizi. Questo dovrebbe semplificare le operazioni di sostituzione dell'applicazione dovute a nuovo sviluppo o a un nuovo acquisto. Infatti in questa architettura sostituire un'applicazione significa trovare una applicazione che possa esporre gli stessi servizi della precedente (e migrare i dati).
Da un punto di vista transazionale tutte le unità di lavoro devono chiudersi a questo livello; questo consente di evitare o quantomeno limitare al massimo l'uso di transazioni distribuite.

 

Layer tecnologico e di normalizzazione dati
Come si vede dalla figura le applicazioni espongono servizi di forme diverse. Questo sta ad indicare sia le diversità nella modellazione dati sia le diversità tecnologiche e di protocollo di comunicazione. Si consente di avere queste diversità perché come spigato nell'architettura SOA non si vogliono accoppiamenti applicativi e tecnologici.
Il layer tecnologico e di normalizzazione dati si occupa di esporre ai layer successivi una sola tecnologia e di effettuare le dovuta normalizzazioni sui dati.
Il protocollo scelto per i layer successivi deve avere il più alto grado di accettazione e di interoperabilità possibile; il pensiero va dunque (ad oggi) ai Web Services, infatti rispetto a CORBA ed altri sistemi di elaborazione distribuita i Web Services sembrano avere l'appoggio dei maggiori vendor e quindi come protocollo sembra il migliore candidato su cui investire.
Questo layer era stato previsto nel mondo java dalla specifica JBI (Java Business Integration) [JSR-208] già nel marzo 2003. Al tempo SOA non era ancora di moda per cui nella specifica non si fa uso esplicito di tutto il lessico SOA. Purtroppo come spesso accade nel JCP (Java Community Process) le cose procedono a rilento e ad oggi la specifica è in public review, ma non è stata pubblicata. I vendor di conseguenza non la implementano e stanno prendendo strade proprietarie come gli ESB (Enterprise Service BUS) di cui parleremo fra poco.
Questo layer di solito si implementa con strumenti di comunicazione asincrona tipicamente code di messaggi (anche quando il pattern di comunicazione è quello delle composite application). Il motivo è come già detto che in SOA predilige la comunicazione asincrona perché aumenta il disaccoppiamento ed in generale consente di creare architetture più scalabili.

 

Layer di composizione di processi
Una volta ottenuta l'omogeneità tecnologica e di rappresentazione dei dati è possibile comporre i servizi in processi di business.
Questa composizione si può realizzare con servizi ad hoc oppure mediante un motore di workflow. Va notato comunque che questo è un layer opzionale di SOA e va implementato solo se strettamente necessario.
Come linguaggio standard per la definizione di workflow sembra si stia imponendo è BPEL [BPEL]. Questo linguaggio consente di definire processi di business secondo molti dei pattern con cui un workflow può presentarsi. Per una trattazione completa dei pattern si veda [WORKFLOWPATTERN]. Il vantaggio di avere definito un workflow mediante un linguaggio standard è che in teoria il cambiamento del motore di workflow non dovrebbe avere ripercussioni sul workflow già sviluppato.
A livello di prodotti non c'è ancora uniformità di accettazione di uno standard per cui alcuni prodotti accettano BPEL, altri accettano standard che hanno meno popolarità di BPEL, altri ancora hanno un linguaggio proprietario. A mio avviso non essendo ancora chiaro quale standard per la definizione del workflow si imporrà, oggi, dovendo scegliere un motore di workflow conviene scegliere in base alle caratteristiche del prodotto e non in base al linguaggio supportato. Quando emergerà uno standard universalmente accettato se il prodotto è un buon prodotto saranno apportati dei miglioramenti per supportare lo standard e saranno messi a disposizione tools di migrazione per i workflow già definiti, altrimenti tanto varrà affrontare i costi di migrazione di prodotto.
Da un punto di vista transazionale, poiché come abbiamo visto le unità di lavoro si chiudono sul layer delle applicazioni a servizi, la composizione dei servizi non sarà transazionale e quindi si dovranno prevedere servizi di compensazione. BPEL per la verità consente sia questo tipo di aggregazione sia aggregazioni transazionali.

 

User end-point layer
In questo layer si situano tutti gli utilizzatori dei servizi.
I particolare quindi le applicazioni di front-end e le applicazioni esterne al sistema informativo che hanno bisogno di accedere ai servizi.
Può valere la pena sottolineare che le applicazioni di front-end non perdono la loro importanza nelle architetture SOA. Infatti queste sono le applicazioni che vede l'utente ed in fondo è proprio l'utente a determinare il successo o meno di un progetto software. Quindi nulla vieta che le applicazioni di front-end siano complesse magari a più livelli e con dati appoggiati su database. Ciò che consiglia l'architettura SOA è che la logica di business sia realizzata mediante chiamate ai servizi. Tutto il resto della logica, quindi logica di sessione, di navigazione, di sicurezza, di caching, di logging ecc…, può e deve essere realizzata nell'applicazione di front-end, in modo che questa sia la più efficiente possibile.

 

Come già detto l'implementazione di una architettura SOA deve essere un processo evolutivo. Quindi ad esempio sarà possibile in alcune fasi dell'evoluzione che le applicazioni a servizi abbiano anche un front-end tradizionale (cioè non a servizi) per esempio per le funzioni di amministrazione, configurazione o backoffice.
ESB
Il layer 2 dell'architettura SOA che abbiamo chiamato tecnologico e di normalizzazione dati ha forti caratteristiche infrastrutturali (che come abbiamo visto la specifica JBI cercava di catturare). Stando così le cose è naturale pensare di realizzare questo layer con un framework sviluppato internamente o con un prodotto acquisito sul mercato. Dunque piuttosto che tanti gateway come in figura 8, possiamo pensare questo layer come mostrato nella figura 10.


Figura 10 -ESB

Il nome che si tende a dare a questo layer software è ESB (Enterprise Service BUS).
Il ruolo infrastrutturale dell'ESB comprende i seguenti compiti base:

  • Supporto alla comunicazione asincrona basata su messaggi. Questa caratteristica consente di abbassare l'accoppiamento temporale ed è da applicare ogni volta che sia possibile.
  • Supporto alla trasformazione dei dati. Questa caratteristica consente di abbassare l'accoppiamento applicativo.
  • Supporto a diversi protocolli di comunicazione e compatibilità con vari connettori software. Questa caratteristica consente di abbassare l'accoppiamento tecnologico.
  • Routing intelligente dei dati. Questa caratteristica consente di esporre tutti i servizi sul layer tecnologico, sarà poi l'ESB a ruotare il messaggio sulla corretto servizio nel layer delle applicazioni a servizi.

Alcune caratteristiche avanzate che un ESB può ospitare sono:

  • Gestione della sicurezza dei servizi
  • Monitoring e management dei servizi
  • Supporto alla composizione dei processi (in questo caso l'ESB sconfinerebbe nel layer 3 di SOA)

Come abbiamo visto ci sono diverse pattern di integrazione fra applicazioni ognuno dei quali richiede caratteristiche e SLA differenti al canale di comunicazione. Mi aspetto dunque che un unico tipo ESB non possa rispondere a tutti i casi di integrazione presenti in una azienda. E' possibile prevedere che esisteranno tre tipi di ESB:

  • ESB batch (per il pattern data consistency)
  • ESB asincrono (per il pattern multistep process)
  • ESB sincrono (per il pattern composite application)

Questi tre ESB saranno diversi, ad esempio l'ESB batch favorirà messaggi di grandi dimensioni, mentre il bus sincrono avrà priorità maggiore su quello asincrono, ma avranno anche caratteristiche che si potranno portare a fattore comune come ad esempio la gestione della sicurezza e la trasformazione dei dati.

Il mercato degli ESB pur essendo piccolo in termini finanziari è molto dinamico per la presenza di svariati player. Da un lato società che proponevano broker di integrazione tradizionali (come webMethods [WEBMETHODS] o IBM [IBM]) hanno fatto rebranding dei loro prodotti convertendoli alle nuove tecnologie (java e Web Services). Dall'altro spesso società di dimensioni più limitate (come Sonic [SONIC] o Fiorano [FIORANO] ) che proponevano sistemi di comunicazioni a messaggi hanno migliorato il loro prodotto aggiungendo le features necessarie ad un ESB. In totale ci sono diverse decine di vendor nessuno dei quali possiede la leadership del mercato. E' prevedibile che nel giro di un paio d'anni il mercato si consolidi facendo emergere chiaramente quattro o cinque vendor. E' importante notare che nell'arena ci anche vendor che tipicamente vendono software applicativo e non di integrazione (come SAP). Il motivo di questo fatto è che il controllo del software di integrazione è strategico in quanto consente di influenzare molto le scelte evolutive del sistema informativo.

Il panorama degli ESB open source (almeno per quanto ne so io) è piuttosto deludente. Infatti sono a conoscenza di solo due progetti: Joram [JORAM] e Mule [MULE].
Il primo è un sistema di messaging piuttosto evoluto, ma secondo me non può ancora dirsi un ESB. Il secondo è un ESB forse ancora un po' carente di funzionalità, ad esempio non ha un sistema di trasformazione dei messaggi. Comunque mi aspetto che presto nasceranno diversi ESB open source anche perché a ben vedere le tecnologie di base di un ESB sono già disponibili (anche open source) e consolidate; bisogna quindi assemblarle coerentemente in un prodotto (anche se non è facile come può sembrare).

Come abbiamo detto i vendor cercheranno di piazzare il proprio ESB all'interno del sistema informativo aziendale è quindi possibile immaginare che presto in un sistema informativo ci sarà più di una marca di ESB come mostrato in figura 11.


Figura 11: Arcipelaghi di ESB

Gartner [GARTNER] chiama questa situazione Arcipelagi di ESB intendendo per arcipelago un gruppo di applicazioni a servizi correlate e coordinate da un ESB.
Gli arcipelagi però non sono isolati e come si vede in figura dovranno comunicare. In qualche modo dunque gli ESB si dovranno parlare o in altre parole ESB di vendor e tecnologie differenti dovranno essere interoperabili. Qualcuno mi ha fatto notare che la figura degli arcipelagi di ESB assomiglia a figure già viste sull'interoperabilità degli ORB di CORBA. In quella situazione l'interoperabilità era piuttosto bassa, nel caso degli ESB i Web Services dovrebbero dare qualche garanzia in più. Ad oggi in realtà gli ESB non sono molto interoperabili, questo è dovuto al fatto che le specifiche dei Web Services sono in continua evoluzione. L'evoluzione è così rapida e tumultuosa che gli ESB talvolta non garantiscono neppure la compatibilità con la versione precedente del medesimo prodotto.
Quando l'evoluzione degli standard dei Web Services si stabilizzerà ci si potrà attendere qualche cosa di più sul piano dell'interoperabilità degli ESB.

 

Conclusioni
Un'azienda che decida di evolvere il proprio sistema informativo verso una architettura SOA deve fare diverse scelte e fronteggiare diverse sfide.
La più importante è certamente quella di evolvere le applicazioni esistenti verso una logica a servizi.
In secondo luogo dovrà dotarsi della infrastruttura organizzativa e tecnologica per gestire i servizi.
Inoltre dovrà effettuare delle software selection per scegliere un adeguato software di integrazione sapendo già in partenza in questo momento questa categoria di prodotti non è ancora matura e stabile.
A mio avviso le architettura SOA danno benefici nelle condizioni ove vi sia una reale necessità di condividere servizi. In tal caso conviene implementare una architettura SOA magari partendo da qualche piccolo, ma significativo use case.
In ogni caso non credo che SOA sia il "Silver bullet" [MMM] (cioè la tecnologia in grado di risolvere completamente) del problema dell'integrazione delle applicazioni, sono certo però che l'approccio di SOA possa portare notevoli semplificazioni. Per capire quanto notevoli bisognerà attendere ancora un po'.

 

Bibliografia
[GARTNER] http://www.gartner.com
[J2EEPATTERN] http://www.theserverside.com/books/wiley/EJBDesignPatterns/downloads/ejbdesignpatterns.pdf
[JSR-208] http://www.jcp.org/en/jsr/detail?id=208
[BPEL] ftp://www6.software.ibm.com/software/developer/library/ws-bpel.pdf
ftp://www6.software.ibm.com/software/developer/library/ws-bpelj.pdf
[WORKFLOWPATTERN] http://tmitwww.tm.tue.nl/research/patterns/
[MULE] http://docs.codehaus.org/display/MULE/Home
[JORAM] http://joram.objectweb.org/
[WEBMETHODS] http://www.webmethods.com/meta/default/folder/0000006281
[IBM] http://www-306.ibm.com/software/info1/websphere/index.jsp?tab=landings/esb
[SONIC] http://www.sonicsoftware.com/products/sonic_esb/index.ssp
[FIORANO] http://www.fiorano.com/products/fesb/fioranoesb.htm
[MMM] "The Mythical Man-Month: Essays on Software Engineering, 20th Anniversary Edition" di Frederick P. Brooks
[ENTERPRISESOA] "Enterprise SOA Service Oriented Architecture Best Practices" di Dirk Krazfig, Karl Banke e Dirk Slama. Edito da Prentice Hall.
[PIRACCINI] http://www.mokabyte.it/2004/09/soa.htm

MokaByte® è un marchio registrato da MokaByte s.r.l. 
Java®, Jini® e tutti i nomi derivati sono marchi registrati da Sun Microsystems.
Tutti i diritti riservati. E' vietata la riproduzione anche parziale.
Per comunicazioni inviare una mail a info@mokabyte.it