Comunicazione fra oggetti distribuiti: RMI e RPC

Comunicazione fra oggetti distribuiti
RMI
invocazione di metodo remoto - gli oggetti remoti ricevono le RMI
interfaccia remota
RPC
meccanismo per la comunicazione cliente servente
come primitiva di un linguaggio di programmazione
Analogia con l’invocazione di un metodo (locale) e la chiamata di procedura (locale)
Diversa implentazione
Servizio a livello RPC è un modulo che interfaccia per esportare operazioni su un
tipo di dato astratto o risorsa
Specifica I parametri di I/O (input al servente, procedura) (output al cliente nel reply)
Se i parametri sono passati per reference indicare se sono I o O o I/O
Esecuzione remota (non si può usare l’ambiente globale del chiamante)
Non si possono usare puntatori a locazioni di memoria
1
Livelli Middleware
Applicazioni
RMI, RPC ed eventi
livelli
Middleware
Protocollo Request Reply
Rappresentazione di dati esterni
Sistema Operativo
C5.2
1
Trasparenza e implementazione
La trasparenza - come per le chiamate di procedura locali
MA RPC più soggette a guasti -> minor trasparenza per distinguere
locale/remoto
interfacce diverse se non c’e’ trasparenza
anche diverse implementazioni
Implementazione
interfaccia
supporto alla RPC, supporto a RMI
integrazione nel linguaggio di programmazione usuale
marshalling
connessione alla procedura del server
comunicazione messaggi request e reply
bindingconnessione del server
Interfaccia
programmi come insieme di moduli comunicanti
identificazione di procedure all’interno di cliente e servente o dei moduli
inclusa nei messaggi di richiesta
Procedure stub
cliente converte la chiamata locale in remota
servente seleziona la procedura adatta (con l’ident.)
decodifica gli argomenti - la esegue - ricodifica il risultatoC5.3
Binding
Collegamento nome -> oggetto (identificatore)
Es: servizio -> porta del server (identificatore di connessione)
Es: Unix indirizzo socket (indirizzo IP, numero porta)
Es: Mach, Amoeba, Chorus indirizzo porta indipendente dalla locazione
Se il cliente usa l’indirizzo IP dell’host è dipendente dalla locazione e
in caso di modifica di allocazione del server, il cliente deve essere ricompilato
Binder
servizio di collegamento
nomi -> porte del server
rende visibili i nomi delle porte dei server ai clienti
Es: procedure
Nel server: register(nome_servizio: stringa; porta_servizio:porta; versione:int);
withdraw (nome_servizio: stringa; porta_servizio:porta; versione:int);
Nel client:
Lookup (nome_servizio: stringa; versione:int): porta;
C5.4
2
Interfacce
I moduli sono implementati in modo da rendere trasparente la realizzazione del
operazioni.
L’interfaccia contiene le sole informazioni utili per l’uso dei metodi invocati.
Interfaccia per RPC o RMI.
Non vi è accesso diretto alle variabili del modulo.
Se il middleware permette diversi linguaggi di programmazione (es. CORBA), si usa
un linguaggio di definizione di interfaccia (IDL - Interface Definition Language) specifica la notazione per def. le interfacce con specifica dei parametri (I/O e tipo)
Interfaccia di servizi - specifica di procedure rese disponibili al cliente
Interfaccia remota - specifica i metodi di un oggetto remoto che sono invocabili da altri
processi, indica gli argomenti I/O
NON si ha mai l’accesso diretto alle variabili
Esempi: CORBA IDL (IDL per RMI), Sun XDR (IDL per RPC),
DCE(Ditributed
Common Object Model) IDL, DCE (Distributed Computing Environment, OSF) IDL
JAVA RMI: integrazione RMI in un linguaggio OO
C5.5
Esempio CORBA IDL
// In file Person.idl
struct Person {
string name;
string place;
long year;
};
interface PersonList {
readonly attribute string listname;
void addPerson(in Person p) ;
void getPerson(in string name, out Person p);
long number();
};
C5.6
3
Modello orientato ad oggetti
Modello orientato ad oggetti è naturale in ambito distribuito
Insieme di oggetti - insieme di dati + metodi
Riferimenti ad oggetti (object reference)
valori - possono essere passati come argomenti o ottenuti come risultati
Interfacce : definizione dei metodi (tipo degli argomenti, valori risultato, eccezioni)
senza riferimento all’implementazione
Metodi : sono implementati se compaiono nell’interfaccia
sono invocati -> modifica lo stato dell’oggetto invocato
può causare altre invocazioni
possono avvenire eccezioni
Java:
una classe può implementare più interfacce
i metodo di una interfaccia possono essere implementati da qualsiasi classe
Necessità di tecniche di garbage collection per il recuperodi spazio di oggetti non più
invocati
C5.7
Metodi di invocazione remota e locale
invocazione
remota
locale
A
B
C
locale E
invocazione
remota
F
locale
D
B e F oggetti remoti
Reference - identificatore di oggetto remoto
interfaccia remota - i metodi sono implementati dalla classe dell’oggetto remoto
C5.8
4
Un oggetto remoto e la sua interfaccia remota
Oggetto remoto
interfaccia
remota
{
Data
m1
m2
m3
implementazione
dei metodi
m4
m5
m6
C5.9
Semantica dell’invocazione
Misure di tolleranza ai guasti
Ritrasmissione del
messaggio request
Filtro dei
duplicati
Semantica della
invocazione
Procedura di riesecuzione
o ritrasmissione di reply
No
Non applicable
Non applicable
Maybe
Sì
No
Riesegui la procedura
At-least-once
Sì
Sì
Ritrasmetti reply
At-most-once
Nella invocazione locale la semantica è exactly one
Semantica della RPC
C5.10
5
Semantiche dell’invocazione
Semantiche dell’affidabilità della invocazione remota (o della RPC) rispetto al chiamante
Maybe
nessuna misura di tolleranza ai guasti
guasti di omissione (invocazione o risultato perso), crash (server)
non riprova la trasmissione
il cliente non sa il motivo e se la RMI o RPC è avvenuta
Almeno una volta
ritrasmissione
esegue i possibili duplicati
guasti di crash (server), guasti arbitrari
idempotenza necessaria
Al più una volta
ritrasmissione senza riesecuzione
C5.11
Implementazione RMI
Ruolo del proxy e skeleton nei metodi di invocazione remota
client
Oggetto A proxy per B
server
Oggetto
skeleton
remoto B
& dispatcher
per classe di B
Request
Reply
Modulo di
Modulo di riferimento
comunicazione
remoto
Modulo di
comunicazione
Modulo di riferimento
remoto
Modulo di comunicazione: realizzano la semantica di invocazione
Modulo di riferimento remoto: traduzione del riferimento locale - remoto,
tabella di oggetti remoti (inclusi i proxy)
Proxy: rende trasparente l’invocazione remota, marshalling/unmarshalling
Dispatcher: riceve la richiesta e seleziona il metodo invocato
Skeleton: (della classe) implementa i metodi nell’interfaccia remota
C5.12
6
Ruolo delle procedure stub di cliente e servente nella RPC
client process
server process
Request
client stub
procedure
Programma
Modulo di
cliente
comunicazione
Reply
server stub
procedure
Modulo di
comunicazione dispatcher
Procedura
di servizio
Stub: come proxy, rende trasparente la chiamata remota, esegue marshal
Dispatcher: seleziona la procedura corrispondente alla richiesta
Server Stub: come skeleton, unmarshal, chiama la server stub, marshal il reply
C5.13
File di interfaccia in Sun XDR
const MAX = 1000;
typedef int FileIdentifier;
typedef int FilePointer;
typedef int Length;
struct Data {
int length;
char buffer[MAX];
};
struct writeargs {
FileIdentifier f;
FilePointer position;
Data data;
};
struct readargs {
FileIdentifier f;
FilePointer position;
Length length;
};
program FILEREADWRITE {
version VERSION {
void WRITE(writeargs)=1;
Data READ(readargs)=2;
}=2;
} = 9999;
1
2
C5.14
7
Notifica di eventi
Un oggetto può notificare eventi che vengono rilevati da altri oggetti
in sistemi distribuiti: gli oggetti possono essere in diverse locazioni
paradigma publish - subscribe
- un oggetto che genera eventi pubblica il tipo di evento che può essere rilevato
- un oggetto che vuole ricevere notifica esegue una subscribe ai tipi di evento di
interesse
notifica: oggetto che rappresenta un evento
Oggetto
(subscriber)
Oggetto
(publisher)
Notifica evento
Genera evento
Tipi di evento, attributi di evento - usati da sottoscrizione e notifica
C5.15
Room system
External
source
Dealer’s computer
Dealer
Dealer’s computer
Notification
Notification
Notification
Information
provider Notification
Notification
Dealer
Notification
Notification
Dealer’s computer
Dealer’s computer
Notification
Information
provider
Notification
Notification
Dealer
Dealer
External
source
C5.16
8
Event Service
Scopo: disaccoppiare publisher e subscriber
event service
- mantiene una base di dati di eventi pubblicati e di interesse
- usato da publisher per generare eventi e da subscriber per indicare quali sono gli
eventi di interesse al fine di ricevere la notifica
Subscribe (quali)
Event Service
Oggetto
(publisher)
Genera evento
Notifica evento
Oggetto
(subscriber)
Modi di notificare:
1. Notifica diretta
2. Notifica via observer
3. Notifica via observer, ma l’oggetto è esterno all’E.S. e viene interrogato
dall’observer
C5.17
Anche catena di più observers per la consegna della notifica
Architettura per la notifica di eventi distribuiti
Event service
subscriber
oggetto di interesse
1.
notifica
oggetto di interesse
2.
oggetto di interesse
3.
notifica
observer
subscriber
notifica
observer
subscriber
notifica
C5.18
9
Observer - Esempio :JINI
Processi observer con diversi compiti:
- forward observer
- filtro di notifica
- modello di eventi
- mailbox di notifiche
consegna (spedizione) di notifica da parte di più oggetti
riduzione del numero di notifiche ricevute da un observer
rispetto a vincoli (predicati) sul loro contenuto
interesse a specifiche relazioni fra eventi
introduce un ritardo nella consegna della notifica qualora il
subscriber non fosse pronto
Esempio: Jini, specifica di eventi distribuiti
subscriber in una Java Virtual Machine (JVM) per ricevere notifiche da oggetti in
un’altra JVM
Oggetti: - generatore di eventi
- Remote Event Listener - riceve le notifiche
- Eventi remoti - notifiche
- Third-party agents - observer
Classi: RemoteEventi
Interfacce: RemoteEventListener con metodo notify (per ricevere le notifiche)
EventGeenrator con metodo register (per sottoscrivere eventi)
C5.19
Interfacce remote Java Shape e ShapeList
import java.rmi.*;
import java.util.Vector;
public interface Shape extends Remote {
int getVersion() throws RemoteException;
GraphicalObject getAllState() throws RemoteException;
1
}
public interface ShapeList extends Remote {
Shape newShape(GraphicalObject g) throws RemoteException; 2
Vector allShapes() throws RemoteException;
int getVersion() throws RemoteException;
}
C5.20
10
Classe Naming di Java RMI registry
void rebind (String name, Remote obj)
Metodo usato dal server per registrare l’identificatore di un oggetto remoto
per nome
void bind (String name, Remote obj)
Metodo alternativo usato dal server per registrare un oggeto remoto per nome,
se il nome è già legato ad un riferimento di oggetto remoto si ha una
eccezione.
void unbind (String name, Remote obj)
Metodo che elimina un collegamento.
Remote lookup(String name)
Metodo usato dal cliente per cercare un oggetto per nome. Restituisce
unriferimento di oggetto remoto.
String [] list()
Metodo che restituisce un vettore di stringhe contenente I nomi collegati nel
registro.
C5.21
Classe Java ShapeListServer con il metodo main
import java.rmi.*;
public class ShapeListServer{
public static void main(String args[]){
System.setSecurityManager(new RMISecurityManager());
try{
ShapeList aShapeList = new ShapeListServant();
Naming.rebind("Shape List", aShapeList );
System.out.println("ShapeList server ready");
}catch(Exception e) {
System.out.println("ShapeList server main " + e.getMessage());}
}
}
1
2
C5.22
11
Classe Java ShapeListServant che implementa l’interfaccia ShapeList
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
import java.util.Vector;
public class ShapeListServant extends UnicastRemoteObject implements ShapeList {
private Vector theList;
// contiene la lista of Shapes
1
private int version;
public ShapeListServant()throws RemoteException{...}
public Shape newShape(GraphicalObject g) throws RemoteException {
2
version++;
Shape s = new ShapeServant( g, version);
3
theList.addElement(s);
return s;
}
public Vector allShapes()throws RemoteException{...}
public int getVersion() throws RemoteException { ... }
}
C5.23
Cliente Java diShapeList
import java.rmi.*;
import java.rmi.server.*;
import java.util.Vector;
public class ShapeListClient{
public static void main(String args[]){
System.setSecurityManager(new RMISecurityManager());
ShapeList aShapeList = null;
try{
aShapeList = (ShapeList) Naming.lookup("//bruno.ShapeList") ;
Vector sList = aShapeList.allShapes();
} catch(RemoteException e) {System.out.println(e.getMessage());
}catch(Exception e) {System.out.println("Client: " + e.getMessage());}
}
}
1
2
C5.24
12
Classi che supportano Java RMI
RemoteObject
RemoteServer
Activatable
UnicastRemoteObject
<servant class>
C5.25
13