Mobile Agent and Enterprise
Architecture Integration
Il Gestore di Librerie e Servizi
Lambertini Riccardo
Abstract: L’utilizzo di un Application Server permette di sviluppare una varietà di servizi e
risorse in ambito enterprise, affrontando tipiche problematiche di gestione in maniera
ottimale. Un componente utile in molti casi è il Gestore di una piattaforma ad Agenti
Mobili che estenda le funzionalità dell’AS avvicinando idealmente i clienti ai servizi in
modo trasparente, permettendo quindi un miglior uso delle risorse locali e remote. In
particolare, tale Gestore, coordinandosi con il servizio di discovery messo a disposizione
dall’AS stesso, effettua il reperimento locale o remoto dei servizi e librerie necessarie
all’esecuzione dell’agente. In base a precise politiche, che considerano anche criteri di
località e bilanciamento del carico, il Gestore decide lo scaricamento delle risorse
necessarie o la migrazione dell’agente verso di esse.
1
Introduzione
Un Application Server (AS) offre servizi di vario tipo come pagine web, Java Servlet Page (JSP),
Enterprise Java Bean (EJB), etc. Normalmente tali servizi sono forniti attraverso la mediazione di un
container che gestisce servizi standard quali persistenza dei dati, gestione delle connessioni remote e
delle istanze di oggetti in memoria, bilanciamento del carico e così via.
Il progetto svolto è relativo all’integrazione su Application Server di un Gestore di Agenti Mobili.
Tale componente modifica il concetto di località del servizio, consentendo di gestire le richieste
pervenute all’AS tramite agenti mobili, in grado quindi di rilocarsi sulla rete. Ad esempio, a seguito di
una richiesta di interazione con un database remoto, l’Agente Mobile incaricato potrebbe spostarsi
attraverso la rete verso il server che offre questo servizio, interrogarlo da locale e, a esecuzione
terminata, riportare i risultati all’AS di partenza.
In questo modo viene ridotto il carico di rete – deve essere trasferito il solo codice dell’agente – si
migliorano le tolleranze ai guasti e possono essere implementate politiche intelligenti per il
bilanciamento del carico.
Il Gestore di Agenti Mobili realizza inoltre una migrazione consapevole degli agenti, scegliendo per
ognuno di essi la località migliore ove eseguire in funzione di precise considerazioni sulla località delle
risorse, sul carico e sulle politiche attuate dai Gestori omologhi.
2
Analisi del problema
L'integrazione di un gestore di una piattaforma ad agenti mobili in un Application Server e la
possibilità, per tali agenti, di interagire con componenti presenti sul server, prevede di dover affrontare
numerose problematiche.
Nell'intenzione di garantire la consistenza con il paradigma di agente mobile, analizziamone le
proprietà fondamentali e i ruoli svolti da chi deve garantirle.
Autonomia: ogni agente possiede uno stato ed è il solo in grado di modificarlo. Tale stato deve però
poter essere conosciuto, tipicamente dal gestore degli agenti mobili, in relazione a decisioni
sull'eventuale migrazione dell'agente
Interazione con l'ambiente: ogni agente deve essere in grado di percepire l'ambiente circostante
mediante l'utilizzo di sensori e di agire nell'ambiente mediante opportuni attuatori. L'agente deve
eseguire e poter decidere di migrare in modo autonomo. Parte dell'interazione con l'ambiente, in
particolare il ruolo di sensore, è mediata dal gestore che conosce: il tipo di risorse di cui ogni agente
necessita ed il suo bisogno di capacità di calcolo, la disponibilità di risorse e di capacità di calcolo sulla
macchina, le librerie necessarie per l'esecuzione dell'agente e le librerie a disposizione sulla macchina.
E' inoltre compito del gestore realizzare un opportuno protocollo di comunicazione con i gestori
presenti sugli altri AS al fine di indagare la presenza in remoto di risorse necessarie all'agente,
richiedere il loro scaricamento o ordinare la migrazione dell'agente verso le risorse.
Proattività: il comportamento dell'agente deve essere guidato da obiettivi. Tipicamente si tratterà
dell'esecuzione di un servizio delegato dall’AS al nostro componente. Ancora una volta il gestore ha il
ruolo di aiutare ed eventualmente guidare l'agente nel raggiungimento del suo scopo, effettuando il
reperimento del servizio e realizzando il deploy dell'agente e delle risorse a lui necessarie.
Cooperazione: ogni agente deve essere in grado di interagire con altri agenti. La piattaforma dovrà
quindi fornire meccanismi per la comunicazione tra agenti. Una cooperazione di più alto livello dovrà
poi essere effettuata a livello dei gestori che attueranno opportuni protocolli di comunicazione al fine di
gestire la mobilità degli agenti, realizzando opportune politiche di gestione delle risorse.
Inoltre, anche se non richiesto esplicitamente, un punto cruciale nell'utilizzo degli agenti mobili è la
gestione della sicurezza. Il problema della sicurezza è duplice: occorrerà infatti proteggere sia
l'ambiente dagli agenti, sia gli agenti dall'ambiente tramite meccanismi di autenticazione reciproca e di
gestione dei permessi di esecuzione per gli agenti. E’ aperta la scelta relativa alla realizzazione, per gli
agenti, di una mobilità forte o una mobilità debole.
Onde garantire scalabilità al sistema è necessario che i nodi in cui è presente il gestore
dell'infrastruttura ad agenti non si conoscano tutti. Una possibile soluzione è di raggruppare
logicamente tali nodi in domini. Ogni nodo del dominio potrà conoscere in toto o in parte gli altri nodi
del proprio dominio e, onde garantire che la rete sia connessa, almeno un nodo per ogni dominio dovrà
avere una conoscenza parziale del resto della rete. Ovviamente il fatto di avere più nodi che hanno
visibilità al di fuori del dominio, ossia la replicazione di una risorsa critica, permette una maggiore
affidabilità della rete.
Il gestore deve comunicare con i rispettivi in remoto per verificare la loro disponibilità di servizi o
librerie necessari alla esecuzione di un agente e la loro disponibilità ad accogliere agenti.
A fronte di forte carico computazionale su un AS, il relativo gestore potrebbe dialogare con i vari
omologhi remoti, per trovare uno o più AS a cui delegare parte del carico, inviando in remoto uno o più
agenti mobili. Questa richiesta, tuttavia, implicherebbe l’attesa delle risposte in condizioni critiche di
sovraccarico. In seconda istanza un gestore potrebbe mantenere localmente una tabella che memorizza
le disponibilità dei nodi del proprio dominio o diverso raggruppamento logico, in modo tale da poter
scegliere, a fronte di carico eccessivo, su quale nodo/i far migrare uno o più agenti. Questo tipo di
struttura richiede continuo aggiornamento dei dati di disponibilità tra i vari nodi del dominio, o diverso
raggruppamento, ma garantisce un'attesa minore in condizioni critiche di sovraccarico.
Al fine di evitare un eccessivo overhead di aggiornamento si potrebbe ipotizzare di avere per ogni
dominio una tabella centralizzata, aggiornata da ogni nodo ad un cambiamento di stato (carico/scarico)
e interrogata su necessità; in questo modo, nell'ipotesi di escludere nodi appartenenti a più
raggruppamenti logici, per ogni evento sarebbe necessario un solo messaggio di aggiornamento.
Ovviamente, nel caso di sovraccarico di tutti i nodi di un dominio è necessario che un gestore possa
interrogarne altri esterni al dominio; ciò è possibile poiché, come detto, almeno un nodo per ogni
dominio deve avere una conoscenza anche parziale del resto della rete. Tramite esso sarà quindi
possibile interrogare tabelle di altri domini.
Per quanto riguarda la gestione delle librerie e dei servizi, a fronte di necessità per un agente di una
risorsa non presente in locale, ci si potrebbe tipicamente appoggiare ad un sistema di nomi e, in base
anche alle informazioni sul carico, attuare politiche intelligenti. A questo proposito, si ricorda infatti
che le decisioni del gestore devono poggiare fortemente su politiche che potrebbero essere specificate
da parte dell'amministratore dell'infrastruttura.
3
Scelte progettuali
Si è scelto di utilizzare l'infrastruttura ad agenti mobili SOMA (Secure and Open Mobile Agent),
progetto in Java sviluppato dal DEIS dell'Università di Bologna. Tale piattaforma, infatti, si adatta
molto bene alla necessità progettuali discusse nel precedente paragrafo:
 Il fatto che SOMA sia stato completamente implementato in Java, senza peraltro averne modificato
la Macchina Virtuale, garantisce la completa portabilità del sistema.
 SOMA garantisce, introducendo opportune astrazioni di località, la scalabilità del sistema.
 SOMA implementa meccanismi di sicurezza tali da garantire protezioni sia degli ambienti di
esecuzione che degli agenti.
 SOMA fornisce già, per ogni Place, l'astrazione di gestore degli agenti fondamentale nella struttura
del progetto. Tipicamente estendendo le funzionalità di quest'ultimo e/o tramite l'implementazione
di particolari tipi di agenti è possibile aggiungere alla piattaforma esistente tutte le funzionalità
necessarie.
Per quanto detto il linguaggio di programmazione adottato è Java.
Si è scelto di utilizzare come Application Server di riferimento la piattaforma sviluppata dal gruppo
JBoss, poichè open source e pienamente compatibile con le specifiche J2EE 1.4.
Per il reperimento di servizi e librerie necessarie all'esecuzione degli agenti si è scelto di utilizzare il
servizio JNDI (Java Naming and Directory Interface) messo a disposizione dall'Application Server.
Oltre a garantire portabilità, scalabilità e sicurezza, l’impostazione strutturale data al progetto cerca
di seguire i principi generali di riusabilità e manutenzione, al fine di garantire al prodotto finale
longevità ed estendibilità nel modo più semplice possibile. A tal fine, la modularità è stata considerata
una scelta obbligata nell’intero progetto e ne consegue pertanto una suddivisione delle responsabilità
tra i vari componenti della piattaforma ad Agenti Mobili.
Si è quindi deciso di suddividere logicamente l’intero sistema in tre parti: il Gestore delle Librerie e
dei Servizi, relativo ai servizi e alle librerie messe a disposizione dai server remoti, il Gestore delle
Politiche, relativo alle politiche e ai fattori influenti sulla migrazione degli AM, e il Gestore della
Mobilità degli Agenti, il cuore dell’applicazione, che si occupa del coordinamento tra le altre due parti,
dell'interazione con l’Application Server locale e della gestione degli Agenti Mobili in esecuzione su di
esso.
Per quanto riguarda le problematiche di rete discusse in fase di analisi, la scelta di SOMA impone di
fatto un’organizzazione dei nodi in domini, che d’altra parte era già stata ipotizzata come soluzione più
logica ai fini della scalabilità.
1
Application
Server
0..*
1
1
1
1
Gestore Librerie e Servizi
MAEAI
0..*
Controllore Agenti
Monitor Risorse di Esecuzione
1
0..*
1..*
1
1
1
Container Politiche
1
Agente Mobile
0..*
Figura 1 - Architettura logica di M.A.E.A.I.
4
Il Gestore di Librerie e Servizi
La caratteristica innovativa principale di questa applicazione, come estensione di una Piattaforma ad
Agenti Mobili, è quella di poter ottimizzare il traffico di rete, già ampiamente ridotto dall’uso degli
Agenti Mobili stessi, permettendo ad essi di migrare laddove vi è più possibilità che l’assoluzione del
servizio avvenga in tempi rapidi. In buona sostanza, aggiunge al servizio di migrazione la
consapevolezza del fatto che il nodo scelto sia il migliore per le politiche adottate.
Questa scelta ottimale del server di destinazione è operata, oltre che secondo una serie di politiche
definibili dall’utente tramite il Gestore delle Politiche, in base alla disponibilità o meno sul nodo
remoto di librerie e/o servizi necessari all’Agente Mobile per poter adempiere al suo compito. A tal
fine, il Gestore della Mobilità degli Agenti interrogherà il Gestore di Librerie e Servizi, informandosi
sulle risorse disponibili sui vari server in lizza per poter essere scelti come destinazione.
In sintesi questo componente, che a tutti gli effetti si potrebbe vedere come un servizio del Gestore
della Mobilità degli Agenti, ha il compito di reperire le informazioni aggiornate relative alle librerie e
ai servizi dei server appartenenti alla rete conosciuta (ma non solo: come vedremo nel capitolo 4.1,
vengono raccolte anche le informazioni dei “vicini” della rete conosciuta, permettendo agli Agenti di
uscire dal “mondo conosciuto” mantenendo però la scalabilità del progetto) senza appesantire le
comunicazioni di rete.
A tal fine, vengono supposti a disposizione due servizi tipici di un Application Server:
 un servizio di discovery dei servizi della rete
 un servizio di gestione del classpath delle librerie
In particolare, viste le specifiche tecnologiche di linguaggio Java e server JBoss, sarà sempre
presente il servizio JNDI (Java Naming and Directory Interface) poiché previsto dalle specifiche della
J2EE 1.4.
4.1 Comunicazioni per lo scambio e il reperimento delle informazioni
Per poter reperire tutte queste informazioni, il Gestore di Librerie e Servizi dovrà in qualche modo
comunicare con i server remoti. Utilizzando a tal fine direttamente i servizi di discovery e di gestione
del classpath delle librerie, il reperimento di informazioni potrebbe non essere facilmente attuabile in
maniera pulita. Ad esempio i server remoti potrebbero non permettere a richieste esterne di poter
manipolare il contenuto del classpath delle librerie, o ancora il servizio di discovery potrebbe non
restituire le informazioni corrette. A proposito di quest’ultimo punto, infatti, le specifiche del JNDI non
prevedono la visibilità della locazione dei servizi e, un’interrogazione diretta, potrebbe restituire, a
seguito di una richiesta della lista dei servizi locali, un lista contenete anche servizi che locali non sono,
ma che sono semplicemente stati inseriti come disponibili nelle tabelle del JNDI. È pertanto legittimo e
più pulito (nonché meno oneroso per il traffico di rete) utilizzare questi servizi attraverso il Gestore di
Librerie e Servizi omologo nel nodo remoto, il quale li ha comunque già a disposizione (eventualmente
con privilegi particolari assegnatigli dal suo server) assicurandosi di ottenere solo i servizi locali.
Scegliere di reperire queste informazioni attraverso il Gestore, potrebbe sembrare vincolante in
quanto, così facendo, si ridurrebbe la gamma di possibili server da scegliere come destinazione per gli
Agenti Mobili al solo sottoinsieme di quegli Application Server su cui risiede MAEAI. Tuttavia un
Agente, per poter migrare e lavorare su di un server, necessita di un’infrastruttura di supporto che lo
possa gestire, senza la quale il server non saprebbe come comportarsi a seguito dell’arrivo dell’Agente
Mobile. È pertanto lecito fare una scelta di questo tipo.
Per mantenere il funzionamento di questo componente scalabile con la dimensione della rete,
requisito fondamentale nel nostro progetto, è sufficiente notare che la piattaforma SOMA mantiene già
di per sé questa proprietà. È quindi sensato nonché utile utilizzare la struttura gerarchica delle reti
SOMA1 come base per reperire le informazioni necessarie sulle librerie ed i servizi della rete.
Seguendo questo ragionamento, si è deciso di strutturare ordinatamente il flusso delle informazioni
della rete secondo un ben preciso schema. In particolare la scelta è stata quella di far convergere le
informazioni dei servizi e delle librerie dei Place di tutto il Dominio sul nodo del DefaultPlace e di
diffondere e scambiare poi questo blocco di informazioni tra i DefaultPlace che si conoscono
reciprocamente. Parallelamente, sarà incarico del DefaultPlace di ogni Dominio fornire ai Place del
proprio Dominio le informazioni sul resto della rete conosciuta.
Lo schema seguente sintetizza i vari flussi di informazioni tra i nodi.
Figura 2 – Comunicazione tra Place
I particolari di come sono stati implementati questi meccanismi verranno affrontati nel capitolo
Implementazione del Progetto.
1
La gerarchia SOMA è strutturata secondo il concetto di Dominio: ogni Dominio consta di uno o più Place, i nodi logici
della rete, uno e uno soltanto dei quali viene eletto a DefaultPlace. Questo particolare nodo è l’unico del Dominio a
conoscere DefaultPlace di altri Domini rendendo la rete connessa e fungendo da “gateway”, mentre gli altri Place hanno una
conoscenza della rete limitata al Dominio di cui fanno parte.
4.2 Comunicazioni con l’Application Server
Il Gestore di Librerie e Servizi, come detto, si appoggia a due servizi garantiti dall’Application
Server sui cui risiede: il servizio di discovery dei servizi remoti e il servizio di gestione delle librerie
nel classpath. All’atto dell’avvio dell’applicazione della nostra piattaforma avviene il legame di questi
due servizi col nostro componente. Successivamente l’utilizzo di questi servizi avverrà direttamente,
senza passare attraverso l’Application Server.
4.3 Struttura del progetto
Il Gestore di Librerie e Servizi, sebbene considerato sin qui come un’entità unica, è logicamente
scomponibile in due parti facilmente individuabili dal nome: il Gestore delle Librerie
(LibrariesManager) e il Gestore dei Servizi (ServicesManager).
Strutturalmente, questi due componenti disgiunti sono molto simili per vari aspetti:
1. utilizzano ad uso esclusivo all’interno di MAEAI un servizio messo a disposizione
dall’Application Server ospitante
2. devono mantenere aggiornate delle informazioni riguardanti il nodo di residenza
3. devono mantenere aggiornate delle informazioni riguardanti la rete
4. devono rispondere a delle richieste riguardanti le informazioni gestite
Pertanto sono stati progettati e sviluppati con lo stesso concetto di fondo, sebbene presentino certune
differenze. Oltre ad utilizzare diversi servizi dell’AS, quindi gestibili in modo differente, le risorse di
cui mantengono aggiornate le informazioni (librerie in un caso, servizi nell’altro) hanno caratteristiche
molto diverse. Principalmente, mentre le librerie possono essere facilmente replicate sui vari nodi della
rete, i servizi sono più complessi da gestire: ad esempio, un servizio che accede ad una base di dati,
potrà sì essere replicato su di un altro server, ma, non avendo sul nuovo nodo la base di dati, non potrà
operare correttamente. In sostanza, la principale differenza tra librerie e servizi è che le prime possono
essere caricate e scaricate tra nodi remoti senza particolari accorgimenti, mentre le seconde non è
previsto possano venir replicate da MAEAI. Nel caso in cui il server si occupi della gestione di questa
replicazione, registrando il nuovo servizio in JNDI quest’ultimo sarà automaticamente riconosciuto dal
Gestore dei Servizi.
Figura 3 – Struttura di un generico Gestore
In Figura 3 si può notare come ciascuno dei due gestori mostri un’interfaccia esterna per poter
ricevere le richieste: richieste provenienti sicuramente dal Gestore della Mobilità degli Agenti, ma,
volendo, anche da un qualunque componente che ne abbia bisogno. Infatti, in linea teorica questa
interfaccia potrebbe anche essere registrata sul servizio di discovery JNDI ed essere utilizzata da nodi
remoti.
Le informazioni proprie del nodo e quelle della rete conosciuta, vengono mantenute all’interno del
Gestore e messe a disposizione in caso di richieste esterne. Per entrambi i tipi di informazioni sono stati
utilizzati dei thread per mantenere aggiornate queste tabelle:


nel caso delle informazioni locali, il thread è usato onde evitare ritardi dovuti al servizio
offerto dall’Application Server, ad esempio causati da code di richiesta sul servizio.
Utilizzando un flusso di controllo separato si evita a priori di bloccare l’intero gestore. In
questo modo anche in fase di aggiornamento delle informazioni, il Gestore è in grado di
rispondere a richieste esterne (ovviamente, per ragioni di consistenza, l’accesso in lettura e
scrittura delle informazioni contenute nel Gestore, riguardino esse il nodo locale o la rete, è
mutuamente esclusivo).
nel caso delle informazioni remote, benché, vista la scelta di gestione al punto precedente, non
ci dovrebbero essere ritardi significativi nel reperimento di informazioni di località sui nodi
remoti, è d’obbligo tenere in considerazione tutte le problematiche di rete che possano
influenzare le tempistiche di questo reperimento, quali ritardi di rete o problemi al server
remoto.
Oltre alle suddette ragioni, l’utilizzo di un thread separato ci permette di poter impostare un
comando ciclico di aggiornamento delle informazioni. Il periodo di questo aggiornamento è impostato
a default all’avvio dell’applicazione, ma può essere modificato ad applicazione avviata tramite
un’interfaccia visibile dal JMX. In aggiunta, l’aggiornamento delle informazioni può essere
direttamente comandato dall’amministratore del server (sempre tramite JMX).
L’utilizzo di due thread separati per ogni tipo di informazione, permette, oltre che di impostare
tempistiche diverse per l’aggiornamento ciclico, di mantener separati i due tipi di problematiche di
ritardo sopra descritte per le informazioni locali e per quelle remote trattando ciascuna
specificatamente.
4.4 Implementazione del Progetto
Vista la simmetria di struttura e comportamento tra il Gestore delle Librerie e il Gestore dei Servizi,
anche l’implementazione verrà trattata per un generico Gestore, specificando ove necessario le
differenze tra i due. In questo senso si parlerà di “risorse” riferendosi alle librerie od ai servizi in
conformità a quale Gestore fanno riferimento.
Sebbene i servizi offerti dall’Application Server di discovery dei servizi e di gestione delle librerie
non abbiano alcun riferimento al sistema di nomi SOMA, si è ritenuto corretto e pulito lavorare
all’interno della nostra piattaforma estesa ad Agenti Mobili col solo sistema di nomi SOMA. Per far
ciò, i due gestori trattati, unici interagenti con questi servizi dell’AS, si occuperanno di tradurre, ove
necessario, i nomi SOMA in indirizzi di rete (utilizzati da questi servizi) e viceversa.
4.4.1 Informazioni su risorse locali
Le informazioni sulle risorse locali sono mantenute in un insieme di valori concernenti il Place su
cui risiede il Gestore, in particolare in un HashSet<String>. Il set permette di evitare la replicazione di
valori all’interno dell’insieme nel caso si tenti di aggiungere una risorsa già presente e l’utilizzo delle
stringhe per rappresentare le risorse viene adottato in quanto String è la classe standard utilizzata per
rappresentare i servizi nel sistema di nomi JNDI (è possibile registrare i servizi anche tramite la classe
Name, ma passare da questa a String e viceversa è un’operazione semplice) ed è anche valida per poter
mantenere i nomi delle librerie Java del classpath.
L’aggiornamento di questa tabella avviene, come detto, tramite interrogazione del servizio dell’AS
relativo: il servizio di gestione delle librerie del classpath in un caso, il servizio di discovery nell’altro.
Tale aggiornamento viene di default invocato periodicamente da un thread ciclico (rispettivamente
UpdaterPlaceLibrariesTableThread e UpdaterPlaceServicesTableThread).
4.4.2 Informazioni su risorse remote
Tutte le informazioni sulle risorse remote sono mantenute in tabelle hash (Hashtable) per poter
essere reperite direttamente: in particolare, ad ogni chiave viene associato un insieme di valori (anche
in questo caso è stato scelto un HashSet, per le stesse ragioni sopra scritte e per omogeneità). In alcuni
casi è risultato comodo mantenere le stesse informazioni in due tabelle dal contenuto identico ma
interrogabili con chiavi differenti, a scapito della memoria occupata su disco ma a tutto vantaggio della
velocità (in ogni caso, memoria e velocità non vengono influenzate, negativamente o positivamente, in
maniera sensibile). Saranno quindi presenti due tabelle: una con chiave la stringa rappresentante la
risorsa e con valori l’insieme dei PlaceID rappresentanti i Place in cui questa risorsa è presente, e
un’altra con chiave il PlaceID e con valori l’insieme di stringhe rappresentanti le risorse presenti su
quel Place. In questo modo è possibile reperire direttamente sia le risorse di un dato nodo, sia i nodi in
cui vi è una data risorsa.
Vi è inoltre una terza tabella utilizzata solo dai DefaultPlace che mantiene, ordinati per chiave
PlaceID, i servizi di tutto il dominio facente capo a questo DefaultPlace. Questa tabella è utilizzata tra
DefaultPlace che si conoscono, come spiegato nel capitolo 2.1 e dalla Figura 1, per scambiarsi in
blocco le informazioni sulle risorse dell’intero dominio del quale si è referenti.
L’aggiornamento di queste tabelle, come per quella delle risorse locali, è comandato da un thread
del tutto simile all’altro, con la sola eccezione che, invece di reperire le informazioni direttamente dal
servizio offerto dall’Application Server, queste vengono richieste ai Gestori omologhi sui nodi remoti
mediante dei Command (descritti nel capitolo 4.4.3 Comunicazioni). L’aggiornamento di queste tabelle
avviene quindi al momento dell’arrivo delle informazioni inviate in risposta dai Gestori remoti.
Ovviamente, avendo qui due tabelle contenenti gli stessi dati, all’atto dell’aggiornamento sarà
mantenuta la sincronia tra le stesse, al fine di mantenere la consistenza dell’insieme d’informazioni.
4.4.3 Comunicazioni
Le comunicazioni tra i corrispettivi Gestori di nodi remoti avvengono sfruttando un meccanismo
fornito dalla piattaforma ad Agenti Mobili SOMA, ossia i Command2. In questo modo è possibile
mandare un Command nel nodo del quale si vuole un’informazione, fargli ottenere quest’informazione
in locale e fargliela rispedire al mittente tramite un altro comando. In particolare quest’altro comando,
una volta raggiunto il nodo richiedente i dati, si occuperà di aggiornare le tabelle locali con la nuova
informazione appena reperita.
L’utilizzo di un comando per ogni nodo del quale si vuole il blocco d’informazioni, porta ad
un’interessante proprietà dell’applicazione: l’aggiornamento delle tabelle locali, dunque, è effettuato
ogni qual volta ritorna uno e un solo comando, evitando ritardi lunghi dovuti a comandi ritardatari o,
peggio, blocco in caso di smarrimento di uno o più comandi. L’incremento del carico di lavoro dovuto
all’uso di un aggiornamento multiplo piuttosto che un singolo aggiornamento di tutti i dati, non è però
significativo visto che, per la struttura stessa delle tabelle, vengono interrogate e modificate solo quelle
righe relative al Place le cui informazioni sono state rinnovate. Le informazioni obsolete relative ai
nodi dei comandi non ritornati vengono perciò mantenute, mentre le informazioni dei nodi dei comandi
ritardatari, vengono aggiornate col relativo ritardo. Un’altra importante scelta effettuata a proposito dei
comandi, è stata quella di inserire nel codice del Command anche il codice del comando di ritorno: in
questo modo si sono potuti gestire anche casi quali l’invio in Place SOMA non più aventi a
disposizione sull’AS MAEAI, oppure quali l’invio da Place SOMA che fanno parte di un dominio il
cui DefaultPlace non abbia la nostra piattaforma. In tutti questi casi, dunque, l’anomalia viene gestita e,
salvo problemi di rete o mancanza dell’infrastruttura SOMA (peraltro necessaria per gestire gli Agenti
Mobili) il comando viene sempre rispedito al mittente.
Questo meccanismo di sicurezza garantisce, appesantendo un poco i comandi mandati sulla rete, una
certa risposta anche in alcuni casi sfavorevoli. A titolo d’esempio, nel caso in cui in un nodo venga
rimossa la nostra piattaforma, il comando ritorna con una lista di risorse vuota. In questo modo dalle
tabelle locali vengono rimosse le righe relative e dunque, successivamente, nessun Agente Mobile
verrà fatto migrare verso quel nodo finché il servizio non torni ad essere disponibile.
5
Conclusioni e sviluppi futuri
Il progetto M.A.E.A.I. integra su un Application Server un componente software in grado di gestire la
logica di una piattaforma ad agenti mobili affidando ad essa non solo il compito di permettere
l’esecuzione e la migrazione degli agenti, ma anche quello di costituire il tramite tra gli agenti e gli altri
componenti presenti sull’AS, incarnando politiche di gestione degli agenti.
In particolare il Gestore di Agenti Mobili realizza una migrazione consapevole degli agenti, scegliendo
per ognuno di essi la località migliore ove eseguire in funzione di precise considerazioni sulla località
delle risorse, sul carico e sulle politiche attuate dai Gestori omologhi.
Tuttavia, come descritto nelle relazioni, M.A.E.A.I. necessita, per alcune delle sue funzionalità,
dell’interazione con componenti che, come suggerito dalle specifiche, non sono stati implementati, ma
supposti come già realizzati: si renderà quindi necessaria, ad esempio, l’integrazione con un
componente in grado di calcolare, per un Application Server, i parametri relativi al fattore di carico
della macchina e il fattore di carico introdotto da un agente in esecuzione.
2
I Command sono in tutto e per tutto thread che, inviati ad un Place remoto tramite la funzione
sendCommand(PlaceID,Command) del NetworkManager di SOMA, incominciano l’esecuzione appena arrivati in loco.
Si deve supporre inoltre che l’AS offra un servizio a cui rivolgere circa le risorse disponibili e il
caricamento di librerie nel classpath, avendo M.A.E.A.I. opportuni protocolli di azione basati su di
esso.
Infine, il servizio JNDI messo a disposizione dall’AS dovrà fornire indicazioni aggiuntive relative alla
locazione dei servizi registrati, funzionalità necessarie per operare le scelte per la migrazione
consapevole degli Agenti Mobili.
Tra gli sviluppi futuri di M.A.E.A.I. si potrebbe prevedere di utilizzare agenti mobili come proxy di un
utente mobile, in grado quindi di memorizzarne informazioni quali sessione o profilo. Si consente in tal
modo la fruizione dei servizi dell’AS da parte di tale utente tramite la mediazione di un componente in
grado, ad esempio, di spostarsi sull’AS più vicino alla posizione dell’utente stesso.
Una possibile estensione, da valutare e gestire attentamente, potrebbe essere l’espansione e/o
l’aggiornamento della conoscenza della rete ad esempio tramite un agente per ogni place. Esso,
migrando di dominio in dominio, potrebbe reperire nuove informazioni di DNS e permettere in questo
modo l’aggiornamento della conoscenza della rete.
6
Appendice A – Diagramma delle classi
Gestore delle Librerie e dei Servizi
SOMA.network.connection.Command
DownloadLibraryCommand
RequestDomainServicesCommand
RequestDomainLibrariesCommand
DownloadLibrariesCommand
RequestGlobalServicesCommand
RequestGlobalLibrariesCommand
UploadLibraryCommand
RequestPlaceServicesCommand
RequestPlaceLibrariesCommand
UploadLibrariesCommand
SOMA.Environment
1
UpdateGlobalServicesTableThread
UpdatePlaceServicesTableThread
1
1
ServicesManager
1
UpdateGlobalLibrariesTableThread
11
1
UpdatePlaceLibrariesTableThread
1
LibrariesManager
IServicesManager
«interfaccia»
JNDI
ILibrariesManager
«interfaccia»
TransferManager
Figura 4 - Diagramma delle classi del Gestore delle Librerie e dei Servizi