A High-Available Instant Messaging Service

Transcript

A High-Available Instant Messaging Service
A High-Available Instant Messaging Service
Bombardi Fabio 165168
University of Bologna
Reti di Calcolatori LS – Prof. Antonio Corradi
A.A. 2004/2005
[email protected]
TU
UT
Abstract L’Instant Messaging ben si presta come caso di studio per una applicazione distribuita. Si vuole
realizzare una applicazione di Instant Messaging come MSN Messenger dove più applicazioni Client
possono scambiarsi messaggi in tempo reale durante la loro connessione ad Internet. Il modello prevede che i
Client si registrino presso un server che memorizza i dati relativi agli utenti e il loro stato attuale (e.g. Online,
Offline, etc.). Il server si preoccupa anche di gestire la lista dei contatti dei Client e di notificare un Client per
eventuali cambiamenti di stato di un suo contatto. In aggiunta al semplice servizio di Instant Messaging si
vuole 1) fornire un servizio ad alta disponibilità: si prevede quindi un sistema di replicazione per il server, hot
spot del sistema, e 2) la possibilità di recapito posticipato dei messaggi nel caso in cui un contatto non sia
online nel momento dell’inoltro. Per lo sviluppo si è utilizzato CORBA come middleware di supporto alla
programmazione distribuita, utilizzando però solamente quei servizi essenziali quali Naming e Notification
Service e demandando le strategie di coordinamento, replicazione e persistenza al progetto del Sistema.
L’Instant Messaging è un buon trampolino di lancio
per la realizzazione di una applicazione distribuita in
quanto permette l’analisi e lo sviluppo di un sistema
in cui occorra realizzare strategie di coordinamento,
replicazione, persistenza affichè venga fornito un
servizio con un alto grado di disponibilità.
Questo articolo si suddivide quindi nei seguenti
capitoli dove verranno presentate e discusse le scelte
riguardanti 1) l’Architettura del sistema 2)
i
protocolli utilizzati (coordinamento, replicazione,
persistenza, etc.) 3) l’implementazione del Sistema 4)
gli sviluppi a cui il sistema potrà essere sottoposto
nell’immediato futuro 5) i riferimenti cui ci si è
ispirati per la realizzazione del sistema.
1.
Architettura del sistema
L’architettura che si è utilizzata per la realizzazione
del nostro servizio di Instant Messaging si rifà al
modello Client/Server anche se lo contorna con
soluzioni avanzate che ne rendono l’architettura
meno centralizzate, là ove si è ritenuto necessario
non sovraccaricare il Server. La scelta del Modello
Client/Server (Figura 1) deriva dalla necessità di
fornire in modo “semplice” una garanzia di consistenza dello
Stato del Sistema. Ovvero, la realizzazione del sistema
di Instant Messaging si sarebbe potuta realizzare in
svariate modalità (MOM, P2P) nelle quali però il
carico
progettuale
sarebbe
cresciuto
esponenzialmente poiché la garanzia di consistenza
dello stato del sistema in tali modelli è proporzionale
alla decentralizzazione degli stessi.
Si è comunque cercato di realizzare un buon schema
architetturale, facendo un’analisi del traffico del
sistema, e cercando di rendere il più possibile
flessibile (decentralizzato) quel traffico a cui il
Sistema è maggiormente sottoposto quando
raggiunge uno stato di regime di funzionamento,
come verrà di seguito spiegato.
1.1 Server
Il Server si preoccupa di registrare le informazioni
relative agli utenti (universal number, nick, etc.) e il
loro stato attuale (online, offline, etc.). Esso si
preoccupa anche di gestiere la lista dei contatti di un
Client e di notificare i Client qualora uno qualunque
di essi cambi stato (online offline e viceversa ).
Esso inoltre si prende cura, nel caso in cui un Client
invii un messaggio ad un altro Client che però risulti
offline, di inoltrare in maniera differita i messaggi al
Client correntemente offline, una volta che questi sia
di nuovo online.
Come risulta sempre in architetture Client/Server, il
Server è l’hot spot del sistema, quindi occorre
studiare una politica di replicazione per far fronte alla
disponibilità del sistema ed evitare DoS (Denial of
Service) ed una politica di persistenza dei messaggi in
memoria di massa per evitare una perdita definitiva
delle informazioni (leggi “stato”) del Server, nel caso
in cui si verifichi un Crash di quest’ultimo.
1.2 Client
Il Client è l’utilizzatore del Servizio di Instant
Messaging. Una volta registratosi persso il servizio
esso è in grado di comunicare in tempo reale con
altri Client correntemente connessi al servizio.
2.
Protocolli
I protocolli del sistema riguardano svariati aspetti e
problematiche dei moderni sistemi distribuiti, come
ad esempio il coordinamento dei Client verso il Server e
dei Client verso gli altri Client. La replicazione del
Server per le motivazioni espresse
colui con cui si vuole parlare (Figura 2.2). Questo
accade una sola volta, in quanto il Client che presenta
richiesta al server per un indirizzo di Client remoto,
memorizza quest’ultima informazione in locale, in
modo tale da non dover ripresentare richiesta al
Server, sgravandolo così di carico inutile.
Figura 1
nella sezione precedente, e la persistenza dei messaggi
non ancora recapitati ad alcun Client, dovuto al fatto
che sono stati inviati a chi non era connesso al
servizio al momento dell’invio.
2.1 Registrazione al Sistema
Un clinet prima di utilizzare il sistema di instant
messaging, deve registrarsi presso il servizio (Server)
e fornire un Nick, che il Server assegnerà unicamente a
quel Client, e sarà il tramite con il quale gli altri Client
potranno fare il dispatch di colui con cui desiderano
instaurare una comunicazione. Vedi Figura 2.1
2.2 Comunicazione fra Client (Online)
Quando un Client presenta al Server la richiesta di un
utente remoto con cui parlare, il Server lo fornisce
solamente se possiede un utente registrato al Servizio
con quel Nick, altrimenti solleva una eccezione, e il
Client non è in grado di aggiungere quel contatto alla
propria lista locale.
Figura 2.1
Una volta che un utente si sia registrato presso il
sistema è in grado di usufruire del servizio.
Per comunicare con altri Client attualmente connessi
al servizio, egli deve fare il dispatch del Client voluto
al server il quale fornirà al richiedente l’indirizzo di
Nel cason in cui, invece, esista presso il Server un
Client registrato con il Nick richiesto, il Server
fornisce al richiedente l’indirizzo dell’utente remoto
con cui si vuole parlare.
A questo punto, il Client che ha presentato richiesta
al Server può registrare le info nella sua lista dei
contatti locale e, se vuole, può instaurare una
comunicazione peer-to-peer con il Client di cui a
richiesto il dispatch. Vedi Figura 2.3
Si è optato per una comunicazione peer-to-peer dei pari
per non sovraccaricare ulteriormente il server,
aumentando in questo modo la decentralizzazione del
sistema, rendendo più lasco l’accoppiamento tra il
Server e i Client in fase di Comunicazione che, in un
Servizio di Instant Messaging a regime, ovvero una
volta che il sistema abbia un certo numero di utenti
Figura 2.2
registrati con una propria lista di contatti locale,
risulta essere il traffico maggiore.
Per ottenere una persistenza dei messaggi nel caso in
cui si abbia Crash del sistema, si attua una
replicazione del server, che serve anche come
garanzia di disponibilità del servizio, in quanto evita
che possa avvenire un Denial of Service.
Figura 2.3
2.3 Comunicazione fra Client (Offline)
Se un Client invia un messaggio ad un altro Client
che è offline, in questo caso il messaggio inviato
viene bypassato al Server (Figura 2.4) che lo
memorizza per consegnarlo la prossima volta che il
Client destinatario si riconnette al Servizio. Figura
2.5
Figura 2.4
Figura 2.5
2.4 Protocollo Online/Offline
Affichè si tenga traccia dei Client correntemente
collegati al Sistema, si è pensato ad un semplice
protocollo: quando un Client entra nel Sistema, dopo
essersi registrato ovviamente, per rendere
consapevoli i Client che hanno manifastato interesser
verso di lui (inserendolo nella loro lista dei contatti
locale), esso deve effettuare il ben noto login presso
il Server. Nel momento in cui un Client effettua il
login nel Sistema, il server si prende carico di
comunicare la cosa ai Client attualmente connessi alla
rete.
Per rendere più lasca la centralizzazione del Sistema,
la comunicazione di un’avvenuta connessione al
Sistema da parte di un Client, avviene attraverso lo
scambio di messaggi. Figura 2.6
Il Server invia un messaggio contenente il nome
(Nick) del Client che ha effettuato la connessione, e il
suo indirizzo in un canale che offre un servizio di
broadcast, e il messaggio viene recapitato a tutti i
Client correntementi connessi al Servizio, cosicchè
coloro che hanno quel particolare Client registrato
nella loro lista dei contatti locali possano
aggiornanrne lo stato corrente.
L’aggiornamento dello stato è essenziale, in quanto è
importante che un Client sappia che un certo suo
Contatto sia o no offline, poiché da questo dipende il
fatto che i messaggi inviati al particolare Contatto
siano o meno bypassati al Server.
2.5 Replicazione del Server
Figura 2.6
Come già detto in precedenza, si vuole fornire un
servizio ad alta disponibilità. Per far questo, ci sono
svariate metodologie. Per esempio, si potrebbe far
uso di Clusterizzazione del Server, in cui i Client sono
a conoscenza di tutte le copie dei Server presenti
online e possono collegarsi ad uno di essi in maniera
non deterministica, i quali quindi si suddividono la
gestione dei Client registrati al Servizio e i messaggi
inviati a Client che sono correntemente offline.
Occorre inoltre un protocollo che ci permetta di
garantire un controllo sullo stato attuale del sistema,
in modo da avere in ogni istante un Sistema Coerente
(e.g. HeartBeat).
La soluzione a Cluster si rifà alla modalità di
replicazioen a Copie Calde, in quanto tra i Server,
non vi è una Copia Master sono tutti pari.
Ovviamente questo comporta un estremo overhead
di sincronizzazione tra le varie copie dei Server.
Questo tipo di replicazione è sembrata troppo
eccessiva per il Servizio che si vuole fornire, il quale
non necessità di un grado di disponibilità così elevato
quale può essere quello reggiunto da un cluster
distribuito.
Nel nostro caso basta una semplice duplicazione del
Server.
Attuiamo quindi un approccio a Copie Fredde, in cui
abbiamo una copia Master e un’unica copia Slave,
che si aggiorna in maniera Time Driven.
In questo modo, in caso di Crash del sistema,
avremmo un Denial of Service minino per un tempo
pari ad un MTTR della stessa durata del quanto di
tempo impiegato dalla copia Slave del Server per
Aggiornarsi.
3. Implementazione
Per l’implementazione del Servizio di Instant
Messaging, si è utilizzato CORBA come Middleware
di Supporto.
CORBA ci fornisce una infrastruttura di appoggio
alla programmazione di Servizi Distribuiti.
Quello di cui ci si è serviti sono stati due
CORBAServices di base quali il Naming Service e il
Notification Service.
Il Naming Service è stato utilizzato in quanto occorre
che ogni Client, ovunque si trovi, sia in grado di
collegarsi al Server per l’erogazione del Servizio.
Il Notification Service, d’altra parte, lo si è utilizzato in
quanto mette a disposizione un servizio di gestione
degli eventi tipo Publish/Subscribe tramite lo
scambio di messaggi.
Per fare questo ci mette a disposizione un canale che
fornisce un servizio di invio dei messaggi in
broadcast.
Si è utilizzato tale servizio per implementare la
notifica di entrata (online) e uscita (offline) dalla rete
dei Client.
Figura 2.7
Il protocollo risulta quindi molto semplice: in caso di
Crash della copia Master del Sistema, nel momento
in cui la copia Slave interroga il Master per effettuare
l’aggiornamento dello stato esso non ottiene risposta.
Nel nostro caso, l’aggiornamento avviene attraverso
l’invocazione di un metodo del Master da Parte della
copia Slave: in caso di Crash il Master non viene
trovato e viene generata una Eccezione.
Nel momento in cui la copia Slave riceve l’eccezione,
capisce che qualcosa è andato storto e si elegge copia
Master. Figura 2.7
Tale protocollo risulta molto semplice ma altrettanto
efficiente in quanto c’è un bassissimo overhead di
coordinamento delle copie Server.
Nel momento in cui ci si accorge del Crash del
sistema non basta far altro che attivare un’altra copia
Slave e il gioco è fatto.
In teoria, tramite tale servizio, avremmo potuto
realizzare il nostro Sistema gestendolo solo a
Scambio di Messaggi ma, come già detto, si è
preferito avere una semplice garanzia di successo per
alcune operazioni fondamentali richieste al Server dai
Client.
L’applicazione che ne deriva, risulta essere un po’
ibrida, ma le tematiche trattate non perdono di
generalità. Infatti ogni problema può essere risolto
sia col modello message passing che con quello ad
invocazione remota.
Presentiamo qui ora, a semplice titolo informativo,
la specifica IDL che si è utilizzata per
l’implementazione del nostro Sistema in CORBA.
Instant Messaging Service CORBA IDL Specification:
1.
2.
3.
4.
5.
module fabio {
module bombardi {
module instantMessaging {
enum IMClientStatus {ONLINE, OFFLINE,
AWAY};
6.
7. typedef string IMClientName;
8. typedef string IMClientID;
9.
10. typedef sequence<IMClientName>
IMClientNameSeq;
11.
12. struct IMClientInfo {
13.
IMClientName
name;
14.
IMClientID
id; // IOR
15.
IMClientStatus status;
16. };
17.
18. typedef sequence<IMClientInfo>
IMClientInfoSeq;
19.
20. struct IMServerClientRegistry{
21.
IMClientNameSeq names;
22.
IMClientInfoSeq info;
23. };
24.
25. struct IMServerOfflineMsgRegistry{
26.
IMClientNameSeq names;
27.
sequence<string> msgs;
28. };
29.
30. interface IMClientProxy{
31.
void sendMsg(in string msg, in
string name);
32. };
33.
34. exception AlreadyRegistered {};
35. exception UnknownClient
{};
36.
37. interface IMServerProxy {
38.
void registerContact(in
IMClientInfo info)
39.
raises (AlreadyRegistered);
40.
41.
void deregisterContact(in
IMClientName name)
42.
raises (UnknownClient);
43.
44.
void login(in IMClientInfo info)
45.
raises (UnknownClient);
46.
47.
void logout(in IMClientName
name)
48.
raises (UnknownClient);
49.
50.
void addContact(in IMClientName
name, out IMClientInfo info)
51.
52.
raises (UnknownClient);
void sendOfflineMessage(in
string name, in string msg)
53.
raises (UnknownClient);
54.
55.
void update();
56.
57.
void getInfo(out
IMServerClientRegistry cRegistry, out
IMServerOfflineMsgRegistry
msgRegistry);
58. };
59. };
60. };
61. };
I sorgenti sono stati inseriti nel package
fabio.bombardi.instantMessaging.
Il Client ha bisogno di fornire come metodo remoto
quello utilizzato dagli altri Client per instaurare la
comunicazione peer-to-peer sendMsg().
Poiché come linguaggio applicativo si utilizza JAVA,
non ci si è preoccupati della sincronizzazione. Si è
infatti optato per la soluzione più semplice, ovvero
definire i vari metodi remoti che possono essere
chiamato contemporaneamente da più entità del
sistema come synchronized.
La specifica IDL del Server invece è molto più
complessa,
in
quanto
i
protocolli
visti
precedentemente, necessitano di metodi differenti. Il
Server fornisce quindi i seguenti metodi che devono
poter essere chiamati in remoto.
Abbiamo i metodi necessari ai protocolli si
sincronizzazione Client/Server e Client/Client:
•
•
•
•
•
•
registerContact() utilizzato dai
Client per registrarsi presso il Servizio di
Instant Messaging.
deregisterContacr() il duale del
metodo precedente.
login() utilizzato dai Client per
connettersi alla rete di InstantMessaging.
logout() utilizzato dai Client per
disconnettersi
dalla
rete
di
InstantMessaging.
addContact() utilizzato dai Client per
aggiungere un contatto nella loro lista
locale.
sendOfflineMessage()
utilizzato
dai Client nel caso in cui tentino di inviare
un messaggio ad un utente offline. In
questo caso abbiamo detto che vi è un
bypass dei messaggi al Server, che si
preoccuperà di recapitarli la prossima volta
che il Client destinatario si connetterà al
Servizio.
Ci sono poi i metodi necessari al protocollo di
replicazione del Server:
•
•
update() utilizzato dal gestore del Time
Slot di aggiornamento della copia Slave del
Server.
getInfo() utilizzato dalla copia Slave
del Server nel momento in cui necessita di
rendere consistente il proprio stato con
quello della copia Master.
I Client inoltre non dispongono della possibilità di
rifiutare i messaggi e via dicendo.
Ancora, la lista dei contatti locale non è resa
persistente, ovvero quando un client si disattiva e poi
successivamente si riattiva, la sua lista dei contatti
viene resettata. Per far fronte a qusto problema, una
prima soluzione potrebbe essere quella di far gerstire
la lista dei contatti di ogni Client al Server.
Ovviamente, ancora, andiamo ad aggiungere
dell’overhead alla comunicazione (anche se quella
non a regime).
Le altre parti della specifica IDL sono relative alla
definizione delgli opportuni Abstract Data Type
necessari allo sviluppo dell’applicazione.
5.
Grande importanza deve avere anche l’analisi delle
Eccezioni.
Ogni metodo remoto infatti deve sollevare
opportune eccezioni in modo tale che chi invoca tali
metodi possa aggangiarsi a tali eccezioni (viste come
hook) in modo tale da riconoscere e gestire le
situazioni anomale che si verificano.
Non tutti i riferimenti bibliografici ovviamente trovano
una piena applicazione nel progetto del sistema
sviluppato. Essi sono stati letti a sostegno di un
background di conoscenza che ci potesse rendere abili
ad analizzare quali scelte fossero migliori per il caso in
esame.
Si veda per esempio lo studio di riferimenti riguardati il
clustering di entità per fornire alta disponibilità, così
come i protocolli necessari alla loro coordinazione (e.g.
heartbeat).
4.
Riferimenti bibliografici
Sviluppi Futuri
Si potrebbe in primo luogo pensare di
reimplementare il servizio secondo un modello
puramente message passing. In questo modo si
andrebbe ad aumentare la decentralizzazione del
sistema, ma occorrerebbe un ulteriore sforzo per
progettare
gli
opportuni
protocolli
di
sincronizzazione (e.g. heartbeat, notifica di avvenuta
ricezione del messaggio, etc.).
Il sistema così come è stato progettato fornisce un
Servizio di Instant Messaging di Base, in cui vengono
aggiunte funzionalità quali l’alta disponibilità e la
persistenza dei messaggi inviati ai Client di cui
conosciamo l’esistenza perché sono registrati nella
nostra lista dei contatti locale, ma il cui stato è
“offline”.
Moltri altri servizi possono essere aggiunti a questo
scheletro di base, come la possibilità di inviare
messaggi criptati, oppure l’autenticazione dei Client nel
momento in cui effettuano il login alla rete.
Un altro servizio utile da aggiungere potrebbe essere
quello dello scambio di file.
Inoltre molteplici miglioramenti possono essere
apportati nell’architettura, anche se ciò, pur
migliorando la decentralizzazione del Sistema,
possono lederne la Semplicità portando un overhead
magari eccessivo per quello che si vuole
effettivamente fornire (e.g. replicazione tramite
Clustering, etc.)
Non è inoltre prevista QoS, e quindi nessuna garanzia
di rispetto dei tempi di risposta sia Client/Server che
Client/Client.
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
A.Corradi. “Dispense di reti di calcolatori LS
A.A. 2004/2005”.
http://www.lia.deis.unibo.it/Courses/RetiLS/
Gerald Brose, Andreas Vogel, Keith Duddy.
“JAVA Programming with CORBA” 3rd Edition.
OMG PRESS, Wiley Distribution.
Stefano Russo, Carlo Savy, Domenico Catroneo,
Antonio Sergio. “Introduzione a CORBA”.
McGraw-Hill.
Quiang Cao, Chang Sheng, Xie. “A Selfadaptation, High-Availability Cluster File System
For Network Application”.
Info-tech and Info-net, 2001. Proceedings. ICII
2001 - Beijing. 2001 International Conferences
on , Volume: 5 , 29 Oct.-1 Nov. 2001
Pages:323 - 327 vol.5
Nicholas A. Solter, Ashutosh Tripathi.
“Architecture and protocol for reliable event
delivery to clients of a high-availability cluster”.
Parallel and Distributed Processing Symposium,
2004. Proceedings. 18th International , 26-30
April 2004.
Pages:28
Alan Robertson. “Linux-HA Heartbeat System
Design”.
Linux-HA
Intra-Cluster
Communications. Proceedings. ALS conference
on 14 October, 2000.
Jin Jing, Abdelsalam (Sumi) Helal, Ahmed
Elmagarmid. “Client-Server Computing in
Mobile Environments”. ACM Comp. Surveys,
v.31, n.2, Mar.1999.
RFC 2778. “A Model for Presence and Instant
Messaging”.
http://www.faqs.org/rfcs/rfc2779.html
[9]
[10]
RFC 2779. “Instant Messaging/Presence
Protocols Requirements”.
http://www.faqs.org/rfcs/rfc2778.html
Mourad Debbabi, Mahfuzur Rahman. “The War
of Presence and Instant Messaging: Right
Protocols
and
APIs”.
Consumer
Communications and Networking Conference,
2004. CCNC 2004. First IEEE , 5-8 Jan. 2004
Pages:341 – 346.