Realisierung verteilter Anwendungen
Voraussetzungen
Datenstrukturen und Algorithmen, Java, HTML, XML
Übungen im Rahmen des Software-Praktikums
Lernziele allgemein:
Grundprinzipien, Werkzeuge und Systeme
Inhalt heute:
Einleitung
Nebenläufigkeit und Synchronisation (in Java)
Ralf Möller, FH-Wedel
Literatur, Details und Zusatzinformationen
http://www.fh-wedel.de/~mo/lectures/vsys.html
Verteiltes System: Definition 1
Andrew Tanenbaum:
Ein verteiltes System ist eine Kollektion
unabhängiger Computer, die den Benutzern als ein Einzelcomputer erscheinen (Transparenz).
Impliziert, daß die Computer miteinander verbunden sind und
die Ressourcen wie Hardware,
Software und Daten gemeinsam
benutzt werden.
Vernetzung
intranet ISP
desktop computer:
backbone
satellite link
server:
network link:
Verteiltes System: Definition 2
Leslie Lamport:
Ein verteiltes System ist ein System, mit dem ich nicht arbeiten kann, weil irgendein Rechner
abgestürzt ist, von dem ich nicht einmal weiß, daß es ihn überhaupt gibt.
Oft die Realität...
Wird aber besser...
Neue Prinzipien des Systemdesigns
Verteilung: Allgemeine Aspekte
Verlassen der „heilen Welt“ des lokalen Prozessors
Heterogenität
Kommunikation (kann Engpaß sein)
Ressourcen stehen temporär nicht zur Verfügung
Notwendigkeit zur Fehlertoleranz
Nebenläufigkeit, fehlende globale Kontrolle/Uhr
Neue Art des Vorgehens bei der Entwicklung:
Systemdesign, Modellierung, Programmierung
Organisationsprinzipien: Server-Client vs. Peer-to-Peer
Dienstbegriff, Komponentenbegriff
Ansätze zur Verteilung
Mehrprozessorsysteme / Verteilte Algorithmen
Verteilte Datenbanken
ODBC, JDBC, JDO
Kommunikationsströme:
Sockets
Hochsprachen:
Standard/prozedural: RPC
Java: RMI, Mobiler Programmcode
Virtuelle Maschine, Just-in-time-Übersetzung
Multiple Programmiersprachen: CORBA
Ereignisse und Notifikationen
the rest of
email server Web server
Desktop computers
File server
router/firewall print and other servers
other servers print Local area
network
email server
the Internet
Fehler
Verlust der Auftragsnachricht (1)
Verlust der Ergebnisnachricht (2)
Ausfall des Servers (3)
Ausfall des Klienten (4)
Klient
Server
(1) (2)
(4)
(3)
Fehlerbehebung und Probleme
Client wartet und versucht...
... nach Timeout ein erneutes Senden,
kann aber nicht zwischen verschiedenen Fehlersituationen unterscheiden.
Erneutes Senden führt zur erneuten Ausführung.
Client antizipiert eventuell neuen Zustand nicht.
Transaktionskonzept erforderlich (teuer!) Festlegung von Dienstgüte-Kriterien
Fehlerbehandlungsstrategien
Maybe
At-least-once
At-most-once
Exactly-once
Fehlerfreier
Ablauf Nachrichten-
verluste Server- ausfall
A: 1 E: 1 A: 1 E: 1 A: 1 E: 1 A: 1 E: 1
A: 0/1 E: 0/1 A: ≥ 1 E: ≥ 1 A: 1 E: 1 A: 1 E: 1
A: 0/1 E: 0/1 A: ≥ 0 E: ≥ 0 A: 0/1 E: 0/1 A: 1 E: 1
A: Ausführung, E: Ergebnis
Inhalte: ein Überblick
Einführung, Nebenläufige Kontrollflüsse, Kommunikation
Middleware, Entfernter Methodenaufruf, RMI, Corba
Objektmigration und technische Grundlagen von Agenten, Voyager
Spontane Vernetzung und entfernter Datenbankzugriff, Jini
Multitier-Architekturen, J2EE:
Dynam. Generierung von Web-Seiten
Konfigurierbare Komponenten für Geschäftsanwendungen
Grundlagen der Transaktionsbehandlung
Fortsetzung Transaktionsbehandlung und Aspekte der Sicherheit
Dienste und Dienstvermittlung, SOAP, WSDL, UDDI
Kryptographie und Sicherheitsdienste
Zahlungssysteme im Internet
Verteilte Multimediasysteme, Quality of Service (QoS)
Überblick: Verteilung und Kommunikation
Finden von Objektreferenzen
Namen vs. Objektbeschreibungen
Lokale Referenzen (Stub) vs. Objekte in Wirtsumgebung
Marshalling/Unmarshalling
Externe Datenrepräsentation (mit pragm. Einschränkungen)
Serialisierung von Objektstrukturen
Ggf.: Kommunikation von Klassendefinitionen
Kontrollaspekte
Dynamische Integration/Anmeldung (Abmeldung?)
Synchrone vs. asynchrone Kommunikation
Ereignisbenachrichtigung
Nutzungsrechte, Gültigkeitseinschränkungen (z.B. Leasing)
„Middleware“
Verteilung: Probleme und Herausforderungen
Zusatzaufwand (Overhead)
Bestimmung der „Grenze“ der übermittelten Objektstrukturen: Balancierung
Synchronisation,
Serialisierbarkeit, Locking,
Deadlocks, Transaktionen
Sicherheit, Verfügbarkeit,
Gültigkeit, Reservierung (QoS)
Abrechnungswesen
Nebenläufigkeit
Ausführung mehrerer Programme (Betriebssystem)
Oder: mehrere Kontrollflüsse in einem Programm:
(in Java Threads genannt)
Zugriff auf gemeinsamen Speicher
Besser: Referenzierung gemeinsamer Objekte
Einsatzspektrum
Problem läßt sich in mehrere Kontrollflüsse zerlegen
In verteilten Systemen häufig:
Abspaltung von Prozessen um Server nicht zu blockieren
Motivation Nebenläufigkeit
Server Client1 Client2
Handler1 Handler2
Nebenläufigkeit und Synchronisation
Ggf. müssen Threads auf andere Threads warten
Meist kein aktives Warten auf Partner (busy waiting) gewünscht
Verwaltung von Threads durch „Laufzeitsystem“
Zustände eines Threads:
laufend
lauffähig (aber ein anderer ist gerade „dran“)
blockiert, in Warteschlange wartend
blockiert, reaktivierbar nach Zeitlimit
Probleme
Verklemmung (deadlocks)
wechselseitiges Warten auf reservierte Betriebsmittel
Verhungern (livelocks)
Warten auf Ressourcen, die nie zur Verfügung stehen
Ungleichbehandlung (unfairess)
Bevorzugung von bestimmten
Prozessen bei der Ressourcenverteilung
Wettlaufeffekte (race conditions)
Ergebnis einer Berechnung hängt von
Ausführungsreihenfolge ab (-> transiente Fehler)
Threads in Java (1)
class ExampleThread extends Thread { ...
ExampleThread(int param) { ... }
public void run() { ... }
public static void main(String[] args) {
ExampleThread t = new ExampleThread(42);
t.start(); } }
Nichts mitschreiben:
Verwendeter Beispielcode unter:
http://www.dpunkt.de/leseproben/3-932588-32-0/jivs_code.zip
Threads in Java (2)
class ExampleRunnable extends SomeClass
implements Runnable {
ExampleRunnable(int param) { ... }
public void run() { ... }
public static void main(String[] args) { ExampleRunnable r =
new ExampleRunnable (42);
new Thread(r).start(); } }
Ein Beispiel: Primzahlen
Primzahl?(n): Sieb des Eratosthenes
Bis sqrt(n)
PrimCalculator: die simple Variante
public class PrimCalculator {
public boolean isPrim(int n) { Sieve sieve = new Sieve(n+1);
return sieve.isPrim(n); }
public static void main(String[] args) { int n = Integer.parseInt(args[0]);
boolean result = (new PrimCalculator()).isPrim(n);
System.out.println("Value "+ n +" is" +
(result?"":" not") +" a prim"); } }
$ java PrimCalculator 1053
Sieb
public class Sieve {
...
public Sieve(int n) { ... }
public isPrim(int n) {
for (int aPrim = 2; aPrim <= rootN;
aPrim = nextPrimAfter(aPrim)) { filter(aPrim); }
return isMarked(n); }
private void filter(int prim) { ... }
private int nextPrimAfter(int prim) { ... } }
Sieb: ein Beispiel
Motivation: Nebenläufige Markierung
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
PrimCalculator: mit Threads (1)
public class PrimCalculator extends Thread {
int n;
PrimCalculator (int n) { this.n = n; }
public void run() {
Sieve sieve = new Sieve(n+1);
boolean result = sieve.isPrim(n);
System.out.println("Value "+ n +" is" +
(result?"":" not") +" a prim"); }
PrimCalculator: mit Threads (2)
public static void main(String[] args) { for(int i=0; (i<args.length); i++) {
int n = Integer.parseInt(args[i]);
(new PrimCalculator(n)).start();
System.out.println("Started Thread for "+n);
} } }
$ java PrimCalculator 7 1053 63
PrimCalculator: eine weitere Variante
Nebenläufiges Herausfiltern
Synchronisation / Zugriff auf gemeinsame Daten
Public class Bank { ...
public float getAmount(Object o); { ... }
public void incrAmount(Object o, float amount); { ... } }
public class Client extends Thread {
Bank b;
public Client(Bank b) {
this.b = b; b.setAmount(this,0.0); }
public synchronized void addToSalary(float amount) { float oldAmount = b.getAmount(this);
b.setAmount(oldAmount + amount) }
Nebenläufigkeit und Verteilung: Server
public class Server extends Thread {
public Server() { this.start() }
public static void main(String[] args) { new Server(); }
Public void run() { while (true) {
System.out.println("waiting for new task");
try { System.in.read(); } catch (...) { ... } Handler handler = new Handler } } }
Nebenläufigkeit und Verteilung: Handler
public class Handler extends Thread {
public Handler() { this.start() }
Public void run() { System.out.println
("Doing some work ...");
try{ Thread.sleep(1000); } catch ( ... ) { ... }
System.out.println ("done"); } }
Asynchrone Aufrufe
Callback vs. Polling
Verteilung und Kommunikation
Kommunikationsprotokoll
Beispiel: TCP/IP
Schicht 4 (bzw. 3) des ISO/OSI Referenzmodells
Transport von Informationen über ein Netzwerk
Zwei Arten:
TCP
UDP
Physical Application Presentation
Session Transport
Network Data link
the rest of
email server Web server
Desktop computers
File server
router/firewall print and other servers
other servers print Local area
network
email server
the Internet
Was haben wir heute gelernt?
Thema: Nebenläufigkeit und Verteilung
Probleme bei Nebenläufigkeit
Erste Lösungsansätze in Java