7 1 1 Grundzge der FernaufrufImplementierung Aufrufbeziehung Aufrufer

  • Slides: 15
Download presentation
7. 1. 1 Grundzüge der Fernaufruf-Implementierung = Aufrufbeziehung Aufrufer Vertreter (proxy, client stub) A

7. 1. 1 Grundzüge der Fernaufruf-Implementierung = Aufrufbeziehung Aufrufer Vertreter (proxy, client stub) A d a p t e r Treiber (skeleton, server stub) Aufgerufener (Modul, Objekt, . . . ) Fernaufrufdienst aus Bibl. Transportdienst BS Hardware Netz

7. 1. 2 Fernbinden (remote linking/binding) = Initialisierung des Vertreters: Einsetzen des Aufrufziels Station

7. 1. 2 Fernbinden (remote linking/binding) = Initialisierung des Vertreters: Einsetzen des Aufrufziels Station + Port + Treiber (Netzverweis, network reference) Wann wird der Netzverweis eingesetzt? Dynamisches Binden: Modul: bei Programmstart oder direkt vor erster Benutzung Objekt: bei Vertretererzeugung, d. i. bei Import eines Verweises als Parameter eines Fernaufrufs (bei Export wird Treiber erzeugt) Woher kommt der Netzverweis? entweder: Initialisierungscode befragt Namensdienst nach bereits existierendem Objekt (bzw. inkarniertem Modul) oder: Initialisierungscode veranlaßt Fernerzeugung (bzw. Ferninkarnation)

7. 1. 2. 1 Namensdienst (name service, naming service, name server) • wird typischerweise

7. 1. 2. 1 Namensdienst (name service, naming service, name server) • wird typischerweise für langlebige öffentliche Module/Objekte verwendet, die als Anbieter (servers) allgemein interessierender Dienste fungieren – ihre Lebensdauer ist unabhängig von der Lebensdauer der sie benutzenden Klienten (clients); • ist selbst ein solcher Anbieter, der über Fernaufruf angesprochen wird; • sein Stellvertreter wird über eine Standard-Bibliothek eingebunden und findet den benötigten Netzverweis z. B. über einen Rundruf (für vereinbarten Port) im lokalen Netz.

interface Name. Service {// Pseudocode, NOT Java RMI ! // ref : : String

interface Name. Service {// Pseudocode, NOT Java RMI ! // ref : : String -> Object void rebind(String name, Object object); // pre: // post: ref‘ name == object && // all // (n -> (n/=name) $imp (ref‘ n == ref n)) // String Object lookup(String name) throws Undefined; // pre: defined(ref name) // post: result == ref name void } unbind(String name); // pre: // post: not(defined(ref name))

Bereitstellung eines Anbieter-Objekts: Programm Server starten, welches Server-Objekt erzeugt und es beim Namensdienst z.

Bereitstellung eines Anbieter-Objekts: Programm Server starten, welches Server-Objekt erzeugt und es beim Namensdienst z. B. unter "Server" anmeldet. Der gestartete Prozeß fungiert als Träger des Objekts und wartet auf eintreffende Fernaufrufe. Start mit java Server &

Anbieter: class Server implements Service {// NOT Java RMI ! public Result op(Argument a)

Anbieter: class Server implements Service {// NOT Java RMI ! public Result op(Argument a) {. . . } public static void main(String[] arg) { Server s = new Server(); Name. Server. rebind(arg[0], s); // creates local skeleton for s // creates proxy for s at name server } } Benutzung durch Klienten: . . . // NOT Java RMI ! Server s = (Server)Name. Server. lookup("Server“); // creates local proxy for server Result r = s. op(x); // creates local skeleton for x // creates local proxy for result. . .

7. 1. 2. 2 Fernerzeugung von Objekten (remote creation) typischerweise bei privaten Objekten verteilter

7. 1. 2. 2 Fernerzeugung von Objekten (remote creation) typischerweise bei privaten Objekten verteilter Programme mit Hilfe entfernter Fabrik-Objekte (object factories) - 3 Alternativen: über im Programm zuvor fernerzeugte Objekte, über bereits vor Programmstart existierende, über Namensdienst erreichbare Fabrikobjekte, über allgegenwärtige, generische Fabrikobjekte (object servers, analog zu process servers).

 Atype x = remote. create(); // creates Atype object // co-located with remote

Atype x = remote. create(); // creates Atype object // co-located with remote Afact af = (Afact)Name. Server. lookup("Atype factory“); Atype x = af. create(); Atype x = new Atype()@host; // NOT Java RMI ! // employs invisible Object Server

7. 1. 3 Programmentwicklung bei konsequenter Verteilungsabstraktion 1. Auf jeder Station den jeweils benötigten

7. 1. 3 Programmentwicklung bei konsequenter Verteilungsabstraktion 1. Auf jeder Station den jeweils benötigten Anwendungscode bereitstellen. 2. Auf jeder Station mittels Vertretergenerator den Code für jeweils benötigte Vertreter und Treiber bereitstellen. Vertetercode trägt denselben Namen wie der Originalcode ! 3. Auf jeder Station alles übersetzen und gegebenenfalls (lokal) statisch binden. (Komplikationen, falls irgendwo Objekte der gleichen Klasse sowohl lokal als auch entfernt benutzt werden. )

7. 1. 4 Semantik von Fernaufrufen sollte eigentlich kein Thema sein – Verteilungsabstraktion! Aber

7. 1. 4 Semantik von Fernaufrufen sollte eigentlich kein Thema sein – Verteilungsabstraktion! Aber subtile (und weniger subtile) Abweichungen von der Semantik lokaler Aufrufe sind oft nur schwer vermeidlich wegen Spracheigenschaften, die sich einer effizienten verteilten Implementierung widersetzen, wegen unzuverlässiger Hardware-Komponenten im Netz. Konsequenzen: warnen vor Ineffizienz (Zeitfaktor 10000) nicht alles erlauben semantische Abweichungen in Kauf nehmen Modifikationen am Quellcode in Kauf nehmen

 Sprachbedingte Probleme (Auswahl) Identitätsprüfung: Wenn zwei Vertreter x und y sich auf das

Sprachbedingte Probleme (Auswahl) Identitätsprüfung: Wenn zwei Vertreter x und y sich auf das gleiche entfernte Objekt beziehen, sollte x==y sein! (referential transparency) Variablenparameter: Formaler Parameter ist Alias für aktuellen Parameter. „Fernzugriff“ auf aktuellen Parameter unterstützen? Teuer! Spezieller Übersetzer! Häufig als Wert/Ergebnisparameter realisiert, d. h. subtil andere Semantik! Übergabe von Objektverweisen: müssen „im Fluge“ in Netzverweise umgewandelt werden – oder bei Geflechten:

Übergabe von Geflechten: häufig als tiefe Kopie (serialisiert in Nachricht gepackt), d. h. mit

Übergabe von Geflechten: häufig als tiefe Kopie (serialisiert in Nachricht gepackt), d. h. mit subtil anderer Semantik. Übergabe von Feldern: Problematisch sowohl als Variablenparameter (s. o. ) als auch bei Wertübergabe eines Feldverweises. Daher häufig Wertübergabe des Feldes, d. h. Übergabe einer Kopie (serialisert in Nachricht gepackt), d. h. mit subtil anderer Sematik.

 Netzbedingte Probleme Mögliche Ursachen: ( Vorübergehende Leitungsstörungen: werden vom Transportsystem oder vom Fernaufrufdienst

Netzbedingte Probleme Mögliche Ursachen: ( Vorübergehende Leitungsstörungen: werden vom Transportsystem oder vom Fernaufrufdienst abgefangen) Unerreichbarkeit der Anbieter-Station oder Klienten-Station Absturz der Anbieter-Station oder Klienten-Station Typische Auswirkung: Fernaufrufdienst wartet nach Aufruf vergeblich auf Antwort (Timeout!)

Fernaufrufdienst hat bestimmte Fehlersemantik. 3 Alternativen: höchstens-einmal-Semantik (at-most-once semantics): Fernaufrufdienst gibt auf. mindestens-einmal-Semantik (at-least-once

Fernaufrufdienst hat bestimmte Fehlersemantik. 3 Alternativen: höchstens-einmal-Semantik (at-most-once semantics): Fernaufrufdienst gibt auf. mindestens-einmal-Semantik (at-least-once semantics): Fernaufrufdienst macht permanent neue Versuche (akzeptabel bei idempotenten Operationen, bei denen eine wiederholte Ausführung den gleichen Effekt wie einzelne Ausführung hat). genau-einmal-Semantik (exactly-once semantics): nur dann erreichbar, wenn Anbieter-Station nicht permanent funktionsunfähig.

. . . und bei Ausfall einer Klienten-Station muß der Anbieter verwaiste Auftragsergebnisse (orphans)

. . . und bei Ausfall einer Klienten-Station muß der Anbieter verwaiste Auftragsergebnisse (orphans) erkennen und abräumen.