VSK
Verteilte Systeme & Komponenten
Verteilte Systeme & Komponenten
-
- 1 / 92
-
Flashcards
Was ist das Adapter Pattern?
- Anpassen der Schnittstelle einer Klasse an die von den Clients erwartete Schnittstelle
- Ist ein Strukturmuster, klassen- oder objektbasiert
- Einfachere Wiederverwendung von existierenden Klassen oder Komponenten, deren Schnittstelle aber unpassend ist.
- Möglichst generelle Schnittstelle durch Adapter anpassen.
Was sind die Unterschiede von Unit- und Integrations-Tests?
Unit Tests:
- Auf einem beliebigen System und jederzeit ausführbar
- OS unabhängig (bei Java)
- Sollten nie aufgrund von Fremdeinflüssen fehlschlagen (z.B. Pfad mit "\" anstelle "/", Zugriffsrechte, etc.)
Integrations Tests:
- Streng genommen Tests, welche z.B. mit dem Dateisystem interagieren oder Sockets verwenden (auch localhost)
Was ist Dependency Injection?
- Verhindert, dass Abhängigkeiten bei Unit-Tests mitgetestet werden.
- Abhängigkeiten werden mittels Parameter übergeben, im Voraus werden diese z.B. als Mock, Spy oder Fake erzeugt
Was sind die Vorteile von Test Doubles?
- Weniger Integrationstests nötig, da vieles bereits mit Unit-Tests getestet werden kann.
- Vorteile von Unit-Tests:
- Test direkt bei Entwickler
- Schnell, häufig, überall lauffähig, vollständig automatisiert
- Hohe Selektivität der Testfälle
- Abhängigkeiten zu konkreten Implementationen vermeiden.
Welche Arten von Test-Doubles gibt es?
Dummy (unecht, funktionslos, Attrappe):
- Primitive, häufig leere Ersatz-Implementation, welche als Parameter übergeben wird.
- Funktionslose Entkopplung von unerwünschten Abhängigkeiten
- Bsp.: Objekt muss übergeben werden, dieses macht aber nichts.
Stub (Stummel, Stumpf, Platzhalter)
- Einfache Implementation, liefert einfache (vordefinierte) Werte (z.B. Konstanten) zurück
- Bsp.: Objekt, welches Authentifikation vornimmt (liefert vordefiniet true oder false)
Spy (spionieren, aussphähen, Spion):
- Alternative Implementation, welche dynamische Werte zurückliefert.
- Merkt sich die Anzahl Aufrufe der Methode
- Aufrufe können verifiziert werden
- Erlaubt "Behavior"-Testing
- Bsp.: Wurde eine Methode auch tatsächlich aufgerufen?
Mock (vorgetäuscht, Simulation):
- Spezialisierung des Spy, kann die korrekte Interaktion selber verifizieren (Spy nicht)
- Typisch von speziellen Mock-Frameworks zur Laufzeit für jeden Testfall erstellt.
- Einziger Unterschied zu Spy: Ort der Verifikation --> Mocks sind spezifischer
Fake (gefälscht, künstlich, nachgemacht):
- Alternative Implementation, welche eine Komponente vollständig ersetzt.
- Bsp.: Webservice wird durch lokale Implementation ersetzt (schneller)
Was wird unter Deployment verstanden?
Technische Aspekte:
- Deployment Diagramme (Zuordnung Komponenten / Hardware)
- Installations- und Deinstallationsprogramme
- Konfiguration
- Installationsmedium
- Repositories (Ablage der Binaries)
Organisatorische Aspekte:
- Konfigurationsmanagement: Welche Komponenten bilden welches Release (Baseline)?
- Installations- und Bedinungsanleitung
- Erwartungsmanagement: Vorhandene Funktionen
- Support
--> Deployment Dokumentation
Was sind Kriterien für gute Funktionen gemäss Clean Code?
Funktionen sollen:
- Klein sein, nur eine Aufgabe erfüllen (--> mehr Funktionen, mehr Klassen)
- nur eine Abstraktionsebene enthalten (SLA --> Single Level of Abstraction)
- Bsp.: Header, Content und Footer in jeweils einer ausgelagerten Funktion definieren und dann zusätzlich ein "\n" einfügen --> andere Abstraktionsebene, nicht gut
- Geringe Einrückungstiefe, möglichst wenig switch-statements (switch besser durch z.B. Strategy Pattern ersetzen)
- einen guten Namen haben
- möglichst wenig Parameter haben
- keine Flag-Parameter verwenden (besser: in mehrere Methoden auslagern)
- keine Nebeneffekte haben
- mit Exceptions anstelle von Fehlercodes arbeiten
- Anweisungen und Abfragen getrennt behandeln (Rückgabewerte bei Set Methoden können teilweise unklar sein)
Welche vier Funktions Smells gibt es?
F1: Zu viele Argumente (0 ideal, 1 ok, 2 in Ausnahmen, ..)
F2: Output Argumente (Widersprechen der Intuition, besser: Zustand des Objekts verändern)
F3: Flag-Argumente (Wenn Flags benötigt werden, wird mehr als eine Aufgabe pro Funktion erledigt --> nicht gut)
F4: Tote Funktionen (sollen gelöscht werden)
Was sind die drei Gesetze des Test Driven Development (TDD)?
- Produktiver Code darf erst implementiert werden, wenn es dafür ein Unit-Test gibt.
- Dieser Unit-Test darf nur gerade so viel Code enthalten, dass er fehlerfrei kompiliert, aber als Test scheitert.
- Man ergänzt jeweils nur gerade so viel produktiven Code, dass der scheiternde Test besteht.
Was sind Kriterien für gute Unit-Tests gemäss Clean Code?
- Lesbarkeit durch: Klarheit, Einfachheit, Ausdrucksdichte
- Testfall nach Build-Operate-Check-Pattern (Vergleich Triple A-Pattern):
- Erstellen der Testdaten (Build)
- Manipulieren der Testdaten (Operate)
- Verifikation der Ergebnisse (Check)
- Nur ein assert pro Test (falls möglich)
- F.I.R.S.T. Prinzip:
- Fast
- Independent
- Repeatable
- Self-Validating
- Timely (Test First)
Was sind die 9 Unit-Test Heuristiken?
- Unzureichende Tests vermeiden (es muss alles getestet werden, was schief gehen kann --> 100% Testabdeckung)
- Coverage-Werkzeug verwenden (Zeigen, was noch nicht getestet worden ist)
- Triviale Tests nicht überspringen (Setter, Getter, Konstruktoren, ..)
- Ignorierte Tests zeigen Mehrdeutigkeit auf (meistens sind die Anforderungen dann nicht ganz klar)
- Grenzbedingungen testen
- Bei Fehlern die Nachbarschaft gründlich testen (Fehler kommen selten alleine)
- Muster des Scheiterns zur Diagnose nutzen (bei vielen Test-Fällen können teilweise Muster erkannt werden, z.B. String zu lang, negative Werte, ..)
- Hinweise durch Coverage Patterns beachten
- Tests sollen schnell sein
Was bedeutet "Persistenz von Objekten"?
- Objektzustand bleibt auch nach Ende des Programms erhalten und können an einer anderen Stelle wieder eingelesen werden.
Anforderungen an Objektpersistenz:
- Transparenz: Transiente und persistente Objekte können gleich behandelt werden.
- Interoperabilität: Persistente Objekte können in anderen Umgebungen verwendet werden (nicht nur in Erstellungsumgebung); Persistierung ist vom System unabhängig
- Skalierbare Wiederauffindbarkeit: Auffinden von persistenten Objekten erfolgt transparent (kein Durchsuchen von Objektpools nötig).
Wie funktioniert die Standard Java Serialisierung?
- Objekt in einen Bytestrom umwandeln und diesen auf einem nichtflüchtigen Speicher ablegen.
Serialisierung:
- ObjectOutputStream.writeObject() --> Arbeitet die Zustände und Objektverweise rekursiv ab und schreibt diese in den Output-Stream.
Deserialisierung:
- ObjectInputStream.readObject() --> Baut aus dem serialisierten Objekt ein Java Objekt.
Was wird von einem Objekt serialisiert?
- Vollständig qualifiziertert Name der Klasse
- Signatur der Klasse
- Alle nicht-statischen, nicht-transienten Attribute
- Objekte, welche auf das Objekt verweisen
- Alle geerbten Attribute
Was geschieht, wenn die Oberklasse eines serialisierbaren Objekts nicht serialisierbar ist?
Die privaten Attribute werden nicht automatisch serialisiert. Daher muss die writeObject Methode überschrieben werden und die Attribute müssen manuell serialisiert werden. Die Deserialisierung muss ebenfalls manuell für die privaten Attribute gemacht werden.
Wie werden serialisierbare Objekte versioniert?
- Manuell, mit dem Attribut serialVersionUID
oder
- Falls das Attribut nicht definiert ist, wird automatisch ein Hash aus dem Klassennamen, den Attributen und den Methoden erstellt.
Wie wird Message Passing definiert?
- Nachrichten werden von eineme Sender zu einem oder mehreren Empfängern gesendet.
- z.B. mittels RMI, Singnale oder Datenpakete
Kriterien:
- Zuverlässige Übertragung nötig?
- Reihenfolge relevant?
- wird one-to-one, one-to-many, many-to-one ode many-to-many gesendet?
- synchron oder asynchron?
Was sind die Formen der nachrichtenorientierten Kommunikation?
- Persistente Kommunikation: Nachricht wird gespeichert, bis Empfänger bereit, z.B. E-Mail
- Transiente Kommunikation: Nachricht wird gespeichert, solange Sender und Empfänger ausgeführt werden, z.B. Router, Socket
- Asynchrone Kommunikation: Sender kann weitere Nachrichten verarbeiten, sobald Nachricht zur Übertragung weitergegeben worden ist, z.B. Forum
- Synchrone Kommunikation: Sender wird blockiert, bis die Nachricht übermittelt worden ist.
Was ist eine Nachricht?
- wird über einen Kommunikationskanal gesendet.
- Enthält eine ID und Argumente
Was sind die Unterschiede von fixen zu adaptiven Protokollen?
Fix:
- Für jede Art von Nachricht sind die möglichen IDs und die möglichen Argumente vordefiniert --> keine Änderungen
Adaptiv:
- Protokoll kann zur Laufzeit ändern (Argumentliste, Argumenttypen, Nachrichtentyp)
- Anpassbarer Message Handler bewältigt die Änderungen zur Laufzeit
Welche 2 Algorithmen zur Synchronisation physischer Uhren gibt es?
Algorithmus von Cristian:
- Zeit-Server: Clients Fragen beim Server die genaue Uhrzeit an. Die Diskrepanz zwischen dem Start der Anfrage und der Antwort wird entsprechend abgezogen (RTT = Round Trip Time).
- Für genauere Werte wird die Anfrage mehrmals gemessen.
- Problem 1: Zeit kann nicht rückwärts laufen --> wenn Client bereits einen neueren Zeitstempel hat als der Server, muss der Client die Uhr verlangsamen, bis die Zeit wieder stimmt.
- Problem 2: Übertragung der Antwort benötigt Zeit --> kleine Ungenauigkeit.
Berkeley Algorithmus:
- Zeit-Server (Zeit Dämon) fragt periodisch die Zeit aller Maschinen ab.
- Basierend auf den erhaltenen Antworten wird die "Durchschnittszeit" berechnet und diese wird an alle Maschinen weitergeleitet.
Wie funktioniert das Network Time Protokoll (NTP)?
Was sind logische Uhren?
- Uhren welche nur innerhalb vom Netzwerk synchronisiert werden.
- Keine Übereinstimmung mit Zeit ausserhalb des Netzwerks.
- Mittels Happened-Before-Relation wird sichergestellt das die kausale Abhängigkeit von Ereignissen korrekt ist.
Was ist die "Happened-Before" Relation?
Definiert, dass eine Nachricht nicht empfangen werden kann, bevor sie gesendet wurde.
Sicherstellen, dass Ereignis a vor Ereignis b passiert.
Wenn weder a --> b noch b --> a zutrifft, dann sind die Ereignisse kausal unabhängig: a || b
Was ist der Lamport-Zeitstempel?
- Wenn ein Prozess eine Nachricht mit einem Zeitstempel versendet, muss der Empfang später sein.
- Die Uhrzeit muss immer vorwärts laufen
- Korrekturen können durch Addition von positiven Werten vorgenommen werden.
- Es gibt nie zwei Ereignisse, welche zur selben Zeit passieren --> Prozessnummer muss dem Zeitstempel zugefügt werden.
- Wenn a im selben Prozess vor b auftritt --> C(a) < C(b)
- Wenn a und b das Senden und Empfangen einer Nachricht darstellen --> C(a) < C(b)
- Alle anderen Ereignisse --> C(a) || C(b)
Welche Middleware Kategorien gibt es?
Kommunikationsorientierte Middleware:
- Schwerpunkt auf Abstraktion der Netzwerkprogrammierung
- RPC, RMI, Web Service
Nachrichtenorientierte Middleware:
- Arbeitet über den Austausch von Messages mit Hilfe von Warteschlangen (queues)
- JMS, SOAP
Anwendungsorientierte Middleware:
- Fokus auf Unterstützung verteilter Anwendungen.
- CORBA, JEE, Microsoft .NET und WCF
Welche Arten von Transparenzen gibt es bei der Middleware?
- Ortstransparenz (Ort an dem sich der Dienst befindet ist dem Benutzer unbekannt)
- Zugriffstransparenz (Zugriff funktioniert immer gleich, egal ob lokal oder Remote)
- Nebenläufigkeitstransparenz (Mehrere Benutzer können gleichzeitig zugreifen)
- Fehler- und Ausfalltransparenz (Übertragungsfehler werden automatisch korrigiert, z.B. Komponentenausfall)
- Sprachtransparenz (Kommunikation ist unabhängig von Programmiersprache)
- Replikationstransparenz (Middleware stellt Möglichkeiten zur Replikation zur Verfügung)
Welche Architekturmodelle gibt es?
- Client-Server
- Peer-to-Peer
- Fat-Client
- Thin-Client
- 2 Tier: Client-Server
- 3 Tier: Client-AppServer-DBServer
- n Tier: Weitere Layers (z.B. Web-Server)
Wie funktioniert RMI?
Unterteilung RMI Server, RMI Client und RMI Registry
RMI Server implementiert ein Remote-Interface und erzeugt Remote-Objekte, welche über die RMI Registry (Namens-Service) publiziert werden.
Clients können über Registry die Remote-Objekte Abfragen
Die Kommunikation zwischen Client und Server erfolgt mittels TCP.
Kommunikation zwischen Client und Server ist transparent.
Welche Voraussetzungen bestehen für Parameter bei RMI?
Falls ein Objekt als Parameter angegeben wird, muss dieses serialisierbar sein.
Wann wird eine Codebase bei RMI benötigt?
Wenn der Client und der Server nicht auf die gleichen Ressourcen (Remote-Interfaces und Objekte) zugreifen können.
Wird z.B. über einen HTTP-Server realisiert.
Sobald eine Codebase vorhanden ist, wird ein Security Manager benötigt.
Was ist ein Security Manager?
Java unterscheidet zwischen lokalem Code und Code aus dem Netz:
Lokaler Code hat Zugriff auf alle Ressourcen
Für Code aus dem Netz ist der Zugriff stark eingeschränkt (kein Zugriff auf lokale Daten, keine TCP/IP-Verbindungen, laden von System-Libraries, ..)
Security Manager hat eine Security Policy (in einem File ausgelagert), welche definiert, was gemacht werden darf. Anhand der Codebase, der Signierung und des Principals können die Rechte eingeschränkt werden.
Welche Kriterien zur Modularisierung gibt es?
- Zerlegbarkeit: Teilprobleme sind unabhängig voneinander entwerfbar.
- Kombinierbarkeit: Module sind unabhängig voneinander wiederverwendbar.
- Verständlichkeit: Module sind unabhängig voneinander zu verstehen.
- Stetigkeit: Kleine Spezifikationsänderungen führen zu kleinen Code-Änderungen.
Welche Entwurfsprinzipien gibt es für Module?
- Lose Kopplung
- Hohe Kohäsion
- Information Hiding
- wenige & exakte Schnittstellen