Kommunikation in verteilten Systemen Jedes verteilte System erfordert Kommunikationsmöglichkeiten Verteilte Systeme Hochschule Regensburg Vorlesung 2, 28.03.2012 Universitätsstraße 31, 93053 Regensburg Prof. Dr. Jan Dünnweber Die Kommunikation basiert auf der Nachrichtenübergabe auf unterster Ebene (Netzwerk), da es nur selten einen gemeinsamen Speicher gibt Bei Tausenden/Millionen von Prozessen in einem großen verteilten System, ist es unmöglich, verteilte Anwendungen auf dieser niedrigen Abstraktionsebene zu entwickeln Dazu ist das Netzwerk oft unzuverlässig, wie z. B. das Internet Plan dieses Kapitels: ◮ ◮ Netzwerke und Protokolle Vier Modelle, die dem Benutzer eine abstraktere Sicht der Kommunikation zur Verfügung stellen: RPC, RMI, nachrichtenorientierte Middleware und Streams Prof. Dr. Jan Dünnweber, Folie 2 von 45 Austausch von Nachrichten: Protokolle Wenn zwei Maschinen in einem System kommunizieren, müssen sie einander “verstehen” (Bsp.: A sendet einen frz. Roman in EBCDIC-Kodierung, B erwartet eine dt. Inventarliste in ASCII) Die entsprechenden “Absprachen” nennt man Protokolle: ◮ ◮ ◮ ◮ Verteilte Systeme Protokollstapel in OSI Das OSI-Modell enthält sieben Schichten (Protokollstapel) Die Protokolle bilden einen Protokollstapel Anmerkung: Die OSI-Schichten sind methodisch hilfreich, die OSI-Protokolle wurden jedoch nie wirklich gebräuchlich Wieviele Volt entsprechen einem 0-Bit bzw. 1-Bit Wie erkennt man das letzte Bit einer Nachricht Wie erkennt man, dass eine Nachricht verloren wurde ... und vieles mehr Zwei wesentliche Arten von Protokollen: Verbindungsorientiert (analog dem Telefon): Eine Verbindung wird aufgebaut, benutzt und abgebaut. Zustellungsgarantie, aber zeitaufwendig. Verbindungslos (analog dem Briefkasten): Nachrichten werden verschickt, ohne Verbindung aufzubauen. Keine Zustellungsgarantie, dafür schneller. Prof. Dr. Jan Dünnweber, Folie 3 von 45 Verteilte Systeme Prof. Dr. Jan Dünnweber, Folie 4 von 45 Verteilte Systeme Protokoll-Schichten, OSI-Modell Das Schichtenmodell soll einen Überblick über das Ablaufen der Kommunikation zwischen zwei Prozessen in einem VS geben: ◮ ◮ ◮ Sender erzeugt eine Nachricht und übergibt sie an die Applikationsschicht (z.B. Bibliotheksprozedur) auf seiner Maschine Die Software der App-Schicht fügt der Nachricht einen Header zu und übergibt sie an die Darstellungsschicht u. s. w. - jedesmal wird Header oder Trailer beigefügt OSI-Schichten: Unterste Ebene Bitübertragungsschicht: überträgt 0s und 1s. Das Protokoll bestimmt unter anderem: ◮ ◮ wieviele Bits pro Sekunde eine oder beide Richtungen Sicherungsschicht: gruppiert die Bits in Frames, erkennt mögliche Übertragungsfehler und korrigiert sie: ◮ ◮ Fügt jedem Frame seine Prüfsumme an und überprüft diese Protokoll bestimmt den Verlauf der “Verhandlungen” zw. Sender und Empfänger bei evtl. Fehlern über Nachsenden etc. Vermittlungsschicht: wählt den Pfad im Netz (routing) ◮ Verteilte Systeme Ganz unten im Protokollstapel überträgt die Bitübertragungsschicht die Nachricht mit allen Headern und Trailern Auf der Empfänger-Maschine wird die Nachricht von unten nach oben weitergereicht Dabei entfernt jede Schicht den für sie vorgesehenen Header/Trailer und wertet ihn aus Prof. Dr. Jan Dünnweber, Folie 5 von 45 ◮ ◮ ◮ Die Idee vonTransportprotokolle Schichten mit eigenen Protokollen an einem OSI-Schichten: anschaulichen Beispiel: Das gebräuchlichste Protokoll – verbindungsloses IP (Internet Protocol) Prof. Dr. Jan Dünnweber, Folie 6 von 45 Verteilte Systeme TCP bei Client-Server: Zwei Chefs und ihre Sekretärinnen Die Sekretärinnen verwenden Fax als technisches Protokoll für Bestellungen, ohne über Inhalt nachzudenken ◮ Die Chefs entscheiden über ihren Inhalt (telefonisch, beim Transportschicht dasdie Netzwerk dem Anwender Golfen, etc.), macht ohne über Bestellungsabwicklung nachzudenken zugänglich ◮ Die beiden Protokolle können unabhängig voneinander Sichert verlustfreie Lieferung der Nachricht ausgetauscht werden ◮ ◮ Baut auf verbindungsorientierten oder -losen Netzwerkdiensten Zwei wichtigste Transportprotokolle: ◮ ◮ TCP (Transport Control Protocol): verbindungsorientiert UDP (Universal Datagram Protocol): verbindungslos TCP funktioniert zuverlässig, verursacht jedoch mehr Overhead Prof. Dr. Jan Dünnweber, Folie 7 von 45 Verteilte Systeme Prof. Dr. Jan Dünnweber, Folie 8 von 45 Verteilte Systeme OSI-Schichten: Höhere Ebene Sitzungsschicht: Dialogmöglichkeit für Benutzer bei langen Übertragungen Darstellungsschicht: Formatierung der Nachrichten In der Praxis werden die zwei o. g. Schichten kaum benutzt Es werden hauptsächlich nur Applikationsprotokolle benutzt: ◮ ◮ FTP (File Transfer Protocol): für Dateien zwischen Clients und Servern HTTP (HyperText Transfer Protocol): ursprünglich für Webseiten, später auch z.B. in Java RMI (s. später) Nun verlassen wir den expliziten Nachrichtenaustausch und betrachten abstraktere Ansätze, um diesen zu verbergen Prof. Dr. Jan Dünnweber, Folie 9 von 45 Verteilte Systeme RPC: Konventioneller Prozeduraufruf Entfernter Prozeduraufruf (RPC – Remote Procedure Call) Die Idee von RPC: anstatt direkten Nachrichtenaustausch zwischen Maschinen: ◮ ◮ ◮ ◮ Es wird den Programmen erlaubt, Prozeduren auf anderen Maschinen aufzurufen Die Parameter werden zur ausführenden Maschine geschickt Das Ergebnis wird an die aufrufende Maschine zurückgebracht Die Kommunikation passiert implizit, d.h. unsichtbar für den Programmierer Potentielle Probleme bei RPC: ◮ ◮ ◮ Die involvierten Programme befinden sich in getrennten Adressräumen Die Maschinen können nicht identisch sein (heterogen) Die Maschinen können abstürzen Prof. Dr. Jan Dünnweber, Folie 10 von 45 Verteilte Systeme RPC: Konventioneller Prozeduraufruf (Forts.) RPC baut auf dem konventionellen Prozeduraufruf auf Beispiel-Aufruf in C: count = read(fd, buf, bytes); zum Einlesen bytes Bytes aus einer Datei fd und Abspeichern im Array buf count = read(fd, buf, bytes); Call-by-value für Wertparameter: bytes und fd werden auf den Stack kopiert Call-by-reference für Zeiger und Arrays: es wird die Adresse des Arrays buf abgelegt Es wird dann ein Aufruf zur BS-Prozedur read erzeugt Die Parameter werden auf den Stack gelegt Prof. Dr. Jan Dünnweber, Folie 11 von 45 Verteilte Systeme Prof. Dr. Jan Dünnweber, Folie 12 von 45 Verteilte Systeme RPC: Client- und Server-Stubs Ziel des RPC: Transparenz, d.h. entfernter Aufruf soll möglichst wie lokaler aussehen Man erreicht dies, indem eine spezielle Version von read, ein sog. Client-Stub verwendet wird Der Stub erzeugt wie im lokalen Fall einen Aufruf an das BS, jedoch nicht zum Lesen der Datei, sondern zum Verpacken und Abschicken der Parameter an den Server (sog. Marshalling) Prof. Dr. Jan Dünnweber, Folie 13 von 45 Verteilte Systeme RPC: Client- und Server-Stubs (Forts.) RPC: Client- und Server-Stubs (Forts.) Im Server übergibt BS die Nachricht an den Server-Stub Beispiel: Entfernter Aufruf von add(i,j): Server-Stub packt die Parameter aus und führt einen lokalen Aufruf auf dem Server aus Prof. Dr. Jan Dünnweber, Folie 14 von 45 Verteilte Systeme RPC: Parameterübergabe und IDL Die Parameterübergabe bei RPC ist nicht unproblematisch: Server-Stub erhält das Ergebnis, verpackt es in einer Nachricht und schickt sie an den Client; anschließend wartet er auf weitere eingehende Anforderungen An der Client-Maschine wertet der Client-Stub die Nachricht aus, packt das Ergebnis aus und kopiert es an seinen Aufrufet Der Aufrufer erhält die Steuerung zurück, er weiß dass der Aufruf erledigt ist, weiß aber nicht wie (bzw. dass entfernt erledigt) Einfache Datenelemente (Zahlen, Zeichen, etc.) haben verschiedene Darstellungen auf unterschiedlichen Maschinentypen: Zeichencode, Bytenummerierung, usw. Eine Referenz (bzw. ein Zeiger): ◮ ◮ ◮ Fazit: Der Zugriff auf externe Dienste erfolgt bei RPC durch lokale Prozeduraufrufe (nicht durch send/receive)! Alle Details der Kommunikation werden in den beiden Stubs-Prozeduren verborgen Prof. Dr. Jan Dünnweber, Folie 15 von 45 Verteilte Systeme Gilt nur im “eigenen” Prozess-Adressraum, verliert ihren Sinn auf entfernter Maschine Für Arrays bekannter Größe: das Array in die Nachricht kopieren, an den Server-Stub senden, der den Server mit einem Zeiger auf das Array aufruft und dann zurückschickt Das funktioniert nicht für Zeiger auf beliebige/dynamische Datenstrukturen, z.B. komplexe Graphen Fazit: Beide Seiten müssen dasselbe Protokoll verwenden, inkl. Daten- und Nachrichtenformate. Das Erstellen von Stubs wird mit IDL (Interface Definition Language) vereinfacht Prof. Dr. Jan Dünnweber, Folie 16 von 45 Verteilte Systeme RMI: Remote Method Invocation (Entfernter Methodenaufruf) RMI: Remote Method Invocation, Fortsetzung Das RPC kann auf die Objektorientierung übertragen werden, was seine Verteilungstranparenz zusätzlich verbessert: ◮ ◮ ◮ ◮ Objekte kapseln Daten (Status) und Operationen (Methoden) ein. Methoden werden über eine Schnittstelle bereitgestellt Die Unterscheidung “Schnittstelle vs. Objekt” erlaubt eine Schnittstelle auf einer Maschine abzulegen und das eigentliche Objekt auf einer anderen Maschine Diese Anordnung wird als “verteiltes/entferntes Objekt” bezeichnet, und bedeutet i.d.R. nicht, dass ein Objekt physisch über mehrere Maschinen verteilt ist Der Client muss sich zum entfernten Objekt binden, was in vielen Systemen automatisch passiert Prof. Dr. Jan Dünnweber, Folie 17 von 45 Verteilte Systeme RMI: Remote Method Invocation, Fortsetzung In den Adressraum wird ein Client-Stub (Proxy im Bild) – eine Implementierung der Objekt-Schnittstelle – geladen Client-Stub verpackt Methoden-Aufrufe in Nachrichten an den Server Prof. Dr. Jan Dünnweber, Folie 18 von 45 Verteilte Systeme RMI: Objektreferenzen RMI unterstützt systemübergreifende Objektreferenzen, um Objekte als Parameter in Methodenaufrufen zu nutzen Objektreferenzen können frei zwischen Maschinen übertragen werden, z.B. als Parameter eines Methodenaufrufs Server-Stub (Skeleton im Bild) packt Nachrichten aus und ruft Methoden auf Objektreferenz enthält Information zum Auffinden des Objekts: Netzwerkadresse der Maschine, Port des Servers, Hinweis auf das Objekt, etc. Beachte: Der Status eines entfernten Objektes befindet sich i.d.R. auf einer Maschine. Auch wenn er verteilt ist, wird dies hinter den Schnittstellen des Objekts verborgen. Die Adresse der Maschine schränkt die Migrations-Transparenz ein, man verwendet oft flexiblere Lösungen, die jedoch die Skalierbarkeit benachteiligen können Damit ein Prozess mithilfe der Objektreferenz eine Methode entfernt aufrufen kann, muss er sich zu dem Objekt binden Prof. Dr. Jan Dünnweber, Folie 19 von 45 Verteilte Systeme Prof. Dr. Jan Dünnweber, Folie 20 von 45 Verteilte Systeme RMI: Parameterübergabe RMI: Parameterübergabe, Forts. Dank Objektreferenzen ist die Parameterübergabe in RMI weniger eingeschränkt als bei RPC Man kann Objektreferenzen als Parameter verwenden: wenn ein Prozess eine Objektreferenz erhält, kann er sich bei Bedarf an das entfernte Objekt binden Effizienz halber unterscheidet man zwischen entfernten und lokalen Objektreferenzen (s. nächste Folie): ◮ ◮ bezieht sich eine Referenz auf entferntes Objekt, so wird sie kopiert und als Wertparameter übergeben bezieht sie sich auf ein lokales Objekt im Client, so wird das Objekt selbst kopiert und übergeben Prof. Dr. Jan Dünnweber, Folie 21 von 45 Verteilte Systeme RMI: Unterschiede zu RPC ◮ Objektargumente werden zum Übertragen serialisiert (Zeichenstrom erzeugt), mit Verweis darauf, wo sich die Objektimplementierung befindet Wegen Vererbung kann der Datentyp eines Parameters evtl. erst zur Laufzeit bestimmt werden. Sollte die entsprechende Klassendatei nicht vorhanden sein, so müssen die Methodendefinitionen nachgeladen/übertragen werden 1 2 ◮ RMI-Applikationen können per se nicht von Rechnern ohne JVM oder von nicht-Java-Programmen benutzt werden Dadurch ist keine IDL (Interface Definition Language) wie bei RPC nötig. Mit Java IDL kann man allerdings Objekte jeder Sprache benutzen, die den CORBA-Standard unterstützt Prof. Dr. Jan Dünnweber, Folie 23 von 45 Verteilte Systeme Definiere ein für Client und Server gemeinsames Ferninterface (remote interface), in dem die Signaturen der entfernt aufrufbaren Methoden enthalten sein müssen Definiere die Server-Seite: ◮ ◮ ◮ ◮ Javas Garbage Collection ist auf entfernte Objekte erweitert Beispiel: Java RMI ist eine reine Java-Angelegenheit: ◮ Verteilte Systeme Java RMI: Übersicht der wichtigsten Schritte RMI erlaubt beliebige Objekte (dagegen: RPC nur einfache Datentypen!) als Argumente eines entfernten Aufrufs: ◮ Prof. Dr. Jan Dünnweber, Folie 22 von 45 3 4 Die Basis von RMI ist ein Fernobjekt (remote object) – Instanz der Server-Klasse – das vom Client aufgerufen werden kann Die Server-Klasse muß ein Ferninterface implementieren Fernobjekte müssen mit einem eindeutigen Namen bei einem Namensdienst (registry) registriert werden Ein solcher Namensdienst läuft im Hintegrund auf dem Server und ist über eine bestimmte Dienstadresse (port number, per default 1099) von Clients ansprechbar Definiere die Client-Seite: Ein Client kann sich von der registry eine Fernreferenz (remote reference) holen und über diese Referenz ein Fernobjekt auf dem Server ansprechen Kompiliere Server u. Client, führe (mit registry im Hintegrund) aus Prof. Dr. Jan Dünnweber, Folie 24 von 45 Verteilte Systeme Verteilte Java RMI Struktur Java RMI Programmierbeispiel: Interface RMI Client registry RMI Server RMI URL protocol Beispiel: es soll eine Fernmethode twice implementiert werden, die den ihr vom Client übergebenen ganzzahligen Parameter- Wert verdoppelt und als Ergebnis an den Client zurück iefert Importieren benötigter Java-Klassenbibliotheken: Web server URL protocol Web server import java.rmi.∗; import java.rmi.server.∗; Client und Server: Definition der Fernschnittstelle: Server assoziiert seine Fernobjekte mit Namen in der Registry Registry stellt Referenzen auf Fernobjekte zur Verfügung Client sucht nach dem Fernobjekt in der Registry, bekommt eine Remote Reference auf das Fernobjekt und kann danach die Methoden dieses Fernobjekts aufrufen Bytecodes können zum dynamischen Nachladen zwischen Client und Server übertragen werden, mittels URL-Protokollen (http, ftp, etc.) vom jeweiligen Webserver Prof. Dr. Jan Dünnweber, Folie 25 von 45 Verteilte Systeme Beispiel: Implementierung des Fernobjekts im Server (1) Implementierungsklasse im Server (Server-Klasse) implementiert Ferninterface RmiExample, indem sie Methode twice definiert Java-Vereinbarung: Klassenname = InterfaceName + ”Impl” public class RmiExampleImpl extends UnicastRemoteObject implements RmiExample{ public RmiExampleImpl() throws RemoteException{ super();}//Konstruktor UnicastRemoteObject aufrufen public int twice(int i) throws RemoteException{ return i∗2;}} Die Implementierungsklasse muß Klasse UnicastRemoteObject erweitern, derer Konstruktor die Fernobjekte der Server-Klasse “exportiert”: sie “lauschen” danach auf Anfragen von Clients, die das gleiche Ferninterface kennen Die Kommunikation zwischen Objekten erfolgt über TCP-Sockets, transparent für den Benutzer! Prof. Dr. Jan Dünnweber, Folie 27 von 45 Verteilte Systeme ◮ ◮ Auf beiden Seiten ein Ferninterface einführen als Erweiterung des Java Interfaces Remote (tag-interface ohne Methoden) Das Ferninterface um die Signaturen der gewünschten Fernmethoden erweitern, in unserem Fall – Methode twice() public interface RmiExample extends Remote { public int twice(int i) throws RemoteException;} ◮ Jede entfernte Methode muß RemoteException werfen können (um Netzwerk-spezifische Fehler abzufangen) Prof. Dr. Jan Dünnweber, Folie 26 von 45 Verteilte Systeme Beispiel: Implementierung des Fernobjekts im Server (2) Der Konstruktor der Server-Klasse muß explizit definiert werden und throws RemoteException beinhalten Er ruft den Konstruktor von UnicastRemoteObject auf Remote "Interface" UnicastRemoteObject extends RmiExample "Interface" extends implements RmiExampleImpl Client und Server sind sich nun des Potentials für Fernaufrufe bewußt: Client kennt das Ferninterface und die (Fern)Methoden-Namen Server implementiert die Fernmethoden dieses Interface Prof. Dr. Jan Dünnweber, Folie 28 von 45 Verteilte Systeme Beispiel: Erzeugen/Registrieren des Fernobjekts im Server Registrierung/Suche der Fernobjekte übernimmt rmiregistry (ein Java Utility Programm) das gleichzeitig mit dem Server läut Ein Fernobjekt wird als Instanz der Impl-Klasse erzeugt und mittels Naming.rebind als TwiceServer auf dem Rechner bolero registriert (wo die rmiregistry läuft) public static void main(String[] args) { RmiExampleImpl example = new RmiExampleImpl(); try {Naming.rebind("//bolero/TwiceServer", example);} catch (RemoteException re){}}} Die Klasse Naming gehört zum Package java.rmi Die allgemeine Syntax ist: //host:port/remoteObjectName, wobei 1099 die default Portnummer für rmiregistry ist Zweites Argument von rebind, hier example, ist eine Ref auf die Objektimplementierung, wo Fernmethoden aufgerufen werden Clients können nun nach TwiceServer auf dem Server suchen Prof. Dr. Jan Dünnweber, Folie 29 von 45 Verteilte Systeme Beispiel: Fernaufruf im Client Beispiel: Registrierung – Fortsetzung Aus Sicherheitsgründen darf bind/rebind nur auf registry des gleichen Hosts passieren; dagegen darf lookup (Nachschauen vom Client in registry) von jedem Host aus ausgeführt werden Methode rebind ändert das Objekt, wenn der Name bereits benutzt wurde, mit bind bleibt das alte Objekt registriert Tip: Sobald ein Fernobjekt registriert ist, können seine Methoden Referenzen auf weitere Fernobjekte liefern. Dadurch wird mehrfaches Nachschauen vom Client in einer (entfernten) registry vermieden (Factory Design Pattern) Auf dem Client, z.B. in der main-Methode, muß der SecurityManager gesetzt werden: System.setSecurityManager(new RMISecurityManager()); Prof. Dr. Jan Dünnweber, Folie 30 von 45 Verteilte Systeme Beispiel: Kompilieren Alle Klassen mit javac kompilieren Client erhält eine Fernobjektreferenz von registry und konvertiert sie (casting) zu RmiExample (Interface, nicht Klasse!). Danach kann er die im Ferninterface definierten Methoden aufrufen Die Server-Klasse RmiExampleImpl mit rmic kompilieren (spezieller RMI-Compiler): rmic -v1.2 RmiExampleImpl produziert eine sog. Stub Class: RmiExampleImpl_Stub.class import java.rmi.∗; public class RmiExampleClient { public void RemoteTwice() { try{ // holen der Fernobjektreferenz von registry // IP der registry evtl. Argument von main RmiExample remintref = (RmiExample)Naming.lookup("//bolero/TwiceServer"); // Aufruf der entfernten Methode int ergebnis = remintref.twice(3);} catch (RemoteException ex){}} public static void main( String args[]){...}} Der Client kommuniziert mit Stubs, die als Fernobjekt-Ersatz dienen. Die Stub-Klasse muß dem Client zugänglich sein (z.B. über die sog. Codebase auf einem serverseitigen Webserver) Das Stub-Objekt leitet Client-Fernaufrufe ans RMI-System, das notwendiges Networking organisiert Option -v1.2 zeigt, daß wir mit Java2 arbeiten; in Java 1.1 hätte rmic zwei Klassen erzeugt : Stub und Skeleton Skeleton ist seit Java 1.2 deprecated Prof. Dr. Jan Dünnweber, Folie 31 von 45 Verteilte Systeme Prof. Dr. Jan Dünnweber, Folie 32 von 45 Verteilte Systeme Programmierbeispiel: Ausführen Starte den Namensdienst im Server (per Default am Port 1099): rmiregistry läuft normalerweise im Hintergrund, keine Reaktion vom System Starte das Programm im Server: java RmiExampleImpl & damit wird ein Fernobjekt erzeugt und bei der registry registriert, die nun auf Anfragen wartet. Wir starten im Hintergrund, da beim Erzeugen von UnicastRemoteObject ein separater Thread gestartet wird, der unbestimmte Zeit lang arbeitet Starte das Programm im Client: java RmiExampleClient Der Client kann so umprogrammiert werden, daß er die IP-Adresse des Servers als Argument bekommt: java RmiExampleClient 130.149.17.51 Nachrichtenorienrierte Kommunikation RPC und RMI erhöhen zwar die Zugriffstranparenz, eignen sich jedoch nicht für alle Situationen: ◮ ◮ wenn nicht vorausgesetzt werden kann, dass beim Absetzen der Anforderung der Empfänger gerade läuft (Persistenz) wenn der Client für die Zeit der Bearbeitung nicht blockiert werden soll (Asynchronität) Beispiel: Ein Email-System braucht persistente Kommunikation: Sender-Host und Empfänger-Host können unabhängig voneinander ein- und ausgeschaltet werden Beachte: Sogar wenn RMI auf einem Rechner getestet wird, muß dieser eine aktive TCP/IP Anbindung haben! Prof. Dr. Jan Dünnweber, Folie 33 von 45 Verteilte Systeme Beispiel: ein verteiltes E-Mail-System Prof. Dr. Jan Dünnweber, Folie 34 von 45 Verteilte Systeme Beispiel: ein verteiltes E-Mail-System Ein Host führt eine Mail-Applikation aus Jeder Host ist mit einem Mail-Server verbunden Mail-Applikation übergibt eine Nachricht an seinen Host, der sie weiter an den lokalen Mail-Server leitet Mail-Server nimmt eine Nachricht, schlägt das Ziel nach und erfährt die Adresse des Ziel-Mail-Servers (Transportebene) Prof. Dr. Jan Dünnweber, Folie 35 von 45 Verteilte Systeme Prof. Dr. Jan Dünnweber, Folie 36 von 45 Verteilte Systeme Beispiel: ein verteiltes E-Mail-System, Forts. Kommunikationsformen: Persistenz und Synchronität Mail-Server richtet eine Verbindung ein und übergibt die Nachricht dem Ziel-Mail-Server Ziel-Mail-Server speichert die Nachricht in einem Puffer für den Empfänger (sog. Mailbox des Empfängers) Ist der Ziel-Mail-Server vorübergehend nicht erreichbar, wird die Nachricht weiterhin auf dem lokalen Mail-Server gespeichert Die Schnittstelle auf dem Empfänger-Host stellt einen Dienst für das Mail-Programm bereit, mit dem dieser regelmässig eingehende Mails überprüfen kann Eingehende Nachrichten werden i.A. auf Mail-Servern, manchmal auch auf den Hosts gepuffert Die nächste Folie zeigt verschiedene mögliche Kombinationen von Asynchronität und Persistenz Prof. Dr. Jan Dünnweber, Folie 37 von 45 Verteilte Systeme Transiente Kommunikation: Sockets Sockets sind eine Schnittstelle direkt zur Transportebene (TCP/IP) und können als eine Middleware-Lösung betrachtet werden Prof. Dr. Jan Dünnweber, Folie 38 von 45 Funktionen für Sockets Funktion Socket Bind Listen Accept Die Funktionen in der Abbildung (socket, bind, listen, accept/connect, send/receive, close) sind auf der nächsten Folie erklärt Verteilte Systeme Connect Send Receive Close Bedeutung Erzeugt einen neuen Kommunikationsendpunkt Ordnet einem Socket eine lokale Adresse zu Kündigt die Bereitschaft an, dass Verbindungen akzeptiert werden Blockiert den Aufrufer, bis eine Verbindungsaufforderung ankommt Versucht aktiv, eine Verbindung einzurichten Sendet Daten über die Verbindung Empfängt Daten über die Verbindung Gibt die Verbindung frei Details und Praxis mit Sockets - in der Übung! Prof. Dr. Jan Dünnweber, Folie 39 von 45 Verteilte Systeme Prof. Dr. Jan Dünnweber, Folie 40 von 45 Verteilte Systeme Stream-Orientierte Kommunikation QoS (Quality of Service) = Dienstgüte Nicht-funktionale Anforderungen (z.B. zeitabhängige) werden häufig als QoS-Anforderungen ausgedrückt, z.B.: Bisher hatten wir Kommunikation zu beliebigen Zeitpunkten mit voneinander unabhängigen Informationseinheiten Es gibt Anwendungen wo Timing eine wesentliche Rolle spielt: ◮ ◮ Audio: Samples müssen in bestimmter Reihenfolge und mit Intervallen von genau 1/44100 Sek abgespielt werden Bei Videos sind die Anforderungen noch strenger Für derartige Anwendungen werden Data-Streams – Folgen der Dateneinheiten – gebraucht Verlustsensibilität und Verlustintervall gibt an, welche maximale Verlustrate akzeptabel ist, z.B. 1 byte/min Spitzverlust: wieviele Einheiten nacheinander verlorengehen dürfen Min. feststellbare Verzögerung: wie lange das Netzwerk DatenAuslieferung verzögern kann, bevor der Empfänger dies erkennt Maximale Verzögerungsabweichung: maximal tolerierter Jitter, d.h. maximale Variation der Zeit, die bei der Auslieferung einer Folge von Dateneinheitentoleriert wird (für Video und Audio) Qualitätsgarantie: eine Zahl die angibt, wie ernst die Dienstanforderungen genommen werden. Die Anwender können ihre Anforderungen i.d.R. nicht genau formulieren, deshalb werden sinnvolle Standardwerte bereitgestellt, z.B.: Audio/Video, Qualität hoch/mittel/gering Prof. Dr. Jan Dünnweber, Folie 41 von 45 Verteilte Systeme Streamkommunikation: Synchronisierungsmechanismen Prof. Dr. Jan Dünnweber, Folie 42 von 45 Verteilte Systeme Streamkommunikation: Synchronisierungsmechanismen Explizite Synchronisation auf der niedrigsten Ebene: ◮ ◮ Ein Prozess führt Operationen auf den Streams aus und stellt sicher, dass die Anforderungen erfüllt werden Nachteil: Die Applikation ist für die Implementierung verantwortlich, obwohl nur Funktionen auf niedrigster Ebene zur Verfügung stehen Synchronisation mit Multimedia-Middleware: Middleware bietet verschiedene Schnittstellen, um Audio- und Video-Streams zu steuern Jedes Gerät hat eigene Schnittstellen, die vom Anwender in Stream-Verarbeitungsroutinen benutzt werden Prof. Dr. Jan Dünnweber, Folie 43 von 45 Verteilte Systeme Prof. Dr. Jan Dünnweber, Folie 44 von 45 Verteilte Systeme Zusammenfassung Was haben wir heute gelernt: Traditionelle Netzwerkapplikationen arbeiten mit Nachrichtenübergabe auf der niedrigen Transportebene Middleware-Systeme stellen eine höhere Abstraktionsebene für Kommunikation bereit, z.B.: ◮ ◮ RPC - ermöglicht Zugriffstransparenz, unterstützt jedoch kaum Referenzen als Parameter RMI - erweitert RPC auf verteilte Objekte, erlaubt systemübergreifende Objektreferenzen als Parameter zu übergeben Nachrichtenorientierte Middleware-Modelle unterstützen Persistenz und Asynchronität, die bei RPC/RMI fehlen Streams: Für Anwendungen wie Audio/Video mit temporären Beziehungen zwischen zwei aufeinanderfolgenden Nachrichten Die Anforderungen werden als QoS (Quality of Service) – Dienstgüte – formuliert Prof. Dr. Jan Dünnweber, Folie 45 von 45 Verteilte Systeme