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