Mittente: Pierpaolo Angelini
"Pierpaolo Angelini" <[email protected]>
Ingegneria Elettronica, 20 06 35 0 90
Gentile professore, in base alle indicazioni da lei fornitemi, ho pensato di modificare le specifiche del progetto.
L'idea iniziale era di realizzare un server replicato che in base ad alcune indicazioni fornite da un cliente tramite una
pagina web fosse in grado di consigliare una possibile configurazione per l'acquisto di un pc. In realtà il servizio era
soprattutto un pretesto per provare alcuni meccanismi della programmazione di rete in Java. Analizzando il problema,
mi sono spostato verso un modello di replicazione più generale che vorrei sottoporle al vaglio.
Specifiche del progetto
Le specifiche sono brevi, infatti l’idea è semplicemente quella di realizzare un gestore di servizi replicati con le seguenti
caratteristiche:
- deve poter lavorare con i web server esistenti, purché compatibili con le servlet, e quindi con Java
- utilizza i servizi cgi e le servlet di ogni genere, già esistenti, e quindi non concepite specificamente per
lavorare in replicazione.
- deve tener conto del carico dei server impiegati, e quindi essere in grado di fare del load sharing.
Linee di sviluppo
Ecco in linea di massima le linee di sviluppo del nuovo progetto:
- L'interfaccia cliente è costituita da una pagina web, nella quale egli invia, attraverso un form, la query verso
uno specifico server.
- Su questo server, un gestore dei servizi, provvede a ricevere la query e a stabilire quale tra le copie dei server
disponibili sia la più scarica e quindi la più adatta a fornire il servizio.
- Il gestore è costituito da una servlet, che risponde al cliente, inviandogli una pagina web.
- La pagina web, contiene una copia nascosta del form iniziale, con gli stessi dati che il cliente aveva inviato al
gestore, ma con un indirizzo di destinazione che questa volta corrisponde esattamente all'indirizzo del server su
cui è attivo il servizio. Il submit della pagina questa volta avviene automaticamente, e il cliente, in maniera
trasparente, vede arrivare direttamente la pagina che corrisponde all'esecuzione del servizio eseguita
dalla meno impegnata delle copie replicate.
Problemi riscontrati
Alcuni problemi emersi approfondendo l’analisi del progetto sono i seguenti:
-
Avendo introdotto un gestore che media le richieste tra il cliente e i servizi, è necessario modificare le pagine
HTML, in maniera tale che il submit, non avvenga più direttamente verso il servizio, ma verso il gestore. Non
basta modificare l'URL del destinatario, occorre anche introdurre all'interno dell'oggetto FORM, un oggetto
INPUT che contenga il nome del vecchio servizio che è stato sovrascritto dall'indirizzo del gestore.
Queste modifiche, comunque, sono rapide, possono essere automatizzate, e avvengono sulla pagina HTML,
quindi sul web server che la pubblica.
-
È necessario che il gestore sappia trattare sia il metodo GET che il metodo POST, utilizzati da servlet e cgi.
-
La seconda richiesta del client, quella che si rivolge direttamente al servizio deve essere automatica. L'utente
infatti ha già manifestato la volontà di voler ricevere il servizio. L'automazione può avvenire attraverso uno
specifico meta in HTML, oppure con una open() in Javascript, o in Java tramite un applet.
-
Il problema più impegnativo è quello del load sharing. Il gestore, per poter decidere quale tra i servizi sia il più
scarico, deve tenere traccia dell'inizio di ciascun servizio su ciascun server, e della sua terminazione. Mentre è
facile, per il gestore, registrare l’inizio del servizio, è più difficile accorgersi che il servizio è finito, perché una
volta che il gestore ha passato il link al client, il client si rivolge direttamente, e automaticamente, al servizio, e
il gestore viene estromesso. Se i servizi fossero stati concepiti per lavorare con la replicazione, potrebbe essere
previsto l'invio di un messaggio dal servizio al gestore. Ma se vogliamo sfruttare i servizi già esistenti, questo
non è possibile.
Un modo per risolvere questo problema potrebbe essere il seguente: la pagina restituita dal gestore al client,
può essere un frame che carica altre pagine. All'interno del frame, utilizzando Javascript è possibile non solo
effettuare il submit verso il servizio, ma anche, in un secondo tempo, inviare un secondo form verso il gestore,
che lo avverta della terminazione di un servizio. Infatti, se assumiamo che il servizio termini con la restituzione
di una pagina HTML, al verificarsi dell'evento "onLoad" di tale pagina, ovvero dopo che la pagina è arrivata,
Javascript può eseguire una funzione che invia il messaggio al gestore. Naturalmente le stesse cose sono
realizzabili anche con un applet.
-
Dopo aver risolto il problema di avere una traccia esatta di tutti i servizi attivi su tutte le copie replicate, è
sufficiente che il gestore attribuisca un peso ad ogni servizio. Quindi alla richiesta di un servizio, non gli resta
che scegliere il server che risulta più scarico e aggiornare il suo valore all'interno di un vettore che contiene il
carico di ciascun server. In maniera analoga, al termine del servizio il valore del carico del server
corrispondente, viene ridotto.
-
Un rischio che si verifica, è che il cliente, dopo aver fatto la richiesta cada. Il livello di occupazione del server
che avrebbe dovuto eseguire il servizio, non viene più ripristinato perché il gestore non riceve più dal cliente la
comunicazione del servizio terminato. Una soluzione è quella di porre un time out in corrispondenza di ciascun
servizio, al termine del quale si possa ritenere concluso il servizio.
-
L’assunzione che un servizio termini con lo scaricamento di una pagina, non è sempre vera nella realtà. In un
servizio interattivo, il servizio restituisce una pagina che contiene altri form, e quindi altre richieste verso il
server. Il cliente, dopo aver scaricato la prima pagina, invia un form al gestore avvertendolo che il servizio è
terminato, mentre la sessione di interazione è appena iniziata. Una possibile soluzione potrebbe essere quella di
considerare terminato un servizio soltanto quando l’utente esce dalla pagina-frame che ha gestito il servizio.
Attraverso la gestione di questo evento “unLoad” è possibile comunicare al gestore che il servizio è terminato.
-
Esiste la possibilità che qualcuno dei server possa essere down. Il gestore potrebbe risolvere questo problema
interrogando periodicamente i servizi.
I limiti del progetto
Alcuni limiti intrinseci nell’impostazione del progetto sono i seguenti:
-
-
Il sistema non prevede che i servizi abbiano stato sui server. In questo caso il gestore dovrebbe garantire la
consistenza delle risorse e l'unica soluzione possibile, compatibile con la premessa di voler riutilizzare i servizi
esistenti, sarebbe quella di consentire l'esecuzione di un servizio alla volta, per ogni tipo di servizio. Ma a
questo punto tutti i vantaggi della replicazione verrebbero meno. Viceversa non c’è nessuna controindicazione
nell'utilizzo dello stato sui client, cioè dei cookie o del Session Tracking nelle servlet.
Un cliente che vuole accedere al servizio direttamente, potrebbe farlo, senza che il gestore possa accorgersi del
servizio in corso e senza che possa aggiornare il valore di occupazione del server.
Queste sono, in linea di massima, le nuove caratteristiche del progetto che intenderei sviluppare. In attesa di suoi
ragguagli, cordiali saluti,
Pierpaolo Angelini