VSK

Verteilte Systeme & Komponenten

Verteilte Systeme & Komponenten


R. S.
Diese Lernkarten behandeln fortgeschrittene Themen der Softwareentwicklung und -tests an der Universität. Sie decken Bereiche wie Versionierung, Konfigurationsmanagement, verschiedene Testmethoden, Integrationsstrategien und Architekturmodelle ab. Entwickler und Ingenieure profitieren davon, um ihre Kenntnisse in der Softwarequalitätssicherung und Systemintegration zu vertiefen.
Karten
92
Lernende
14
Sprache
Deutsch
Kategorie
Informatik
Stufe
Universität
Erstellt / Aktualisiert
23.06.2018 / 20.01.2024

Lernkarten

Sie verstehen das Konzept der Software-Komponenten

  • Eigenständige, ausführbare SW-Einheit --> Subsysteme, Prozesse, Objekte
  • Sind über Ihre Schnittstellen austauschbar (z.B. Logger Komponente)
  • Unabhängige Entwicklung voneinander
  • Können installiert und deployed werden
  • Wiederverwendbar

 

Was sind die Vorteile von Komponenten?

  1. Wiederverwendung
    1. Divide and Conquer
    2. Wiederverwendung ist schneller als neu erstellen
    3. Weniger Testing notwendig
    4. Bessere konsistenz, da "standard" Komponenten
  2. Interface
    1. Präzise Spezifikationen
    2. Bereits getestet
  3. Ersetzen
    1. Programmierung der einzelnen Komponenten unabhängig voneinander.
    2. Komponenten sind austauschbar
    3. Änderung haben kleinere Auswirkungen auf das Gesamtsystem.
  4. Wirtschaftlichkeit
    1. Bereits programmierte Komponenten müssen nicht neu erstellt werden

Was beinhaltet die Spezifikation einer Komponente?

  • Export: Interfaces, welche die Komponente zur Verfügung stellt.
  • Import: Benötigte / benutze Interfaces von anderen Komponenten (Imports)
  • Verhalten: Verhalten der Komponente
  • Kontext: Rahmenbedingungen im Betrieb der Komponente

Was sind die Vorteile von Schnittstellen?

  1. Schnittstellen machen Software leichter verständlich, da Implementierung irrelevant.
  2. Schnittstellen helfen bei der Reduktion von Abhängigkeiten (verglichen mit der gleichen Software ohne Schnittstellen aber trotzdem mehrere Komponenten)
  3. Erleichtern die Wiederverwendung

Was sind die Kriterien einer guten Schnittstelle?

  1. Schnittstellen sollen minimal sein
    1. wenige Methoden
    2. wenige Parameter
  2. Schnittstellen sollen einfach zu verstehen sein
  3. Schnittstellen sollen gut dokumentiert sein

Was beinhaltet eine Interface Doku?

  • Alles was für die Benutzung der Komponente wichtig ist
  • Alles was der Programmierer verstehen und beachten muss
  • Definition der Methoden
    • Syntax (Rückgabewerte, Argumente, Typen)
    • Semantik (Was bewirkt die Methode?)
    • Protokoll (z.B. synchron, asynchron)
    • Nichtfunktionale Eigenschaften (Performance, Robustheit, Verfügbarkeit, allenfalls Kosten)

Interface Typen: Was sind Operational Interfaces?

"Eine Komponente stellt Services zur Verfügung, welche vom Caller abgerufen werden können"

  • Gruppiert zusammengehörige Operationen
  • Wenn ein Client eine Operation verwendet, ist es gut möglich, dass auch eine andere Operation benötigt wird (Reservation tätigen, freie Plätze abfragen)

z.B. Reservationssystem:
"MakeReservation": Verändert den Zustand des Reservationssystems
"TakeUpReservation": Enthält Methode "beginStay()" --> Ist abhängig vom Zustand des Reservationssystems

Spezifikation:

  • Name
  • In- und Output Parameter
  • Änderungen, welche am System getätigt werden durch die Operationen
  • Spezifikation, wie die In-, Outputs und Zustände voneinander abhängig sind.

Interface Typen: Was ist ein Stream- und Signal-Interface?

  • Stream Interface:
    • the name of the interface
    • produced streams (outgoing)
    • consumed streams (ingoing)
    • quality of services (e.g. max. dataflow)
  • Signal Interface:
    • the name of the interface
    • outgoing signals
    • ingoing signals

Wie werden Schnittstellen in UML definiert?

Welche Aktionen sind nötig um Daten verbindungsorientiert (TCP) zu versenden?

  1. Socket erzeugen (IP und Port)
  2. Socket an einen lokalen Port binden (Server-seitig)
  3. Daten über Socket lesen/schreiben
  4. Socket schliessen

Wie funktioniert der Lebenszyklus eines TCP Servers?

  1. Server-Socket erzeugen (Server hört auf diesen Port)
  2. Mit accept-Methode auf eine Verbindung warten
  3. In- und Output-Stream erstelln und mit dem Socket verknüpfen
  4. Daten über die Sreams lesen und schreiben (gemäss dem vereinbarten Protokoll)
  5. Stream von Client und Socket schliessen
  6. Wieder zu Schritt 2 oder Socket schliessen

Was ist ein Network Interface?

  • Verbindung zwischen einem Computer und einem privaten oder öffentlichen Netzwerk
  • Generell ein Netzwerk Adapter (NIC)
    • Kann auch Software sein (Loopback Interface)
  • NIC muss beim erstellen des ServerSockets angegeben werden
  • In Java: Klasse NetworkInterface
    • new ServerSocket(13, 10, inet) --> Socket hört auf Port 13, akzeptiert 10 Clients und hört auf die IP definiert in der Variable inet.

Was ist ein SCM (Source Control Management System)?

  • Zeitliche Entwicklung von Artefakten festhalten.
  • Erlaubt Rückgriff auf alte Änderungstände (Revisionen).
  • Für Arbeiten im Team ausgelegt
  • Keine Backupsysteme
  • Fokus: Nachvollziehbarkeit von Änderungen
  • Änderungen werden als "Changesets" innerhalb einer Transaktion gespeichert.

Was ist verteiltes SCM?

Es wird eine lokale Kopie des Repos angelegt. Änderungen werden zuerst nur lokal gemacht, mit einem push dann auch auf dem Remote Repo.

Welche SCM Systeme gibt es?

CVS:

  • Alt, sehr robust, zentraler Server
  • einfache Anwendung, gut überschaubar
  • Nur dateibasierend (Verzeichnisstruktur nicht versioniert)
  • Ablage von Binärdateien ineffizient
  • Keine Transaktionen möglich

Subversion:

  • Nachfolger von CVS, zentraler Server
  • Transaktionsorientiert (Commit in Transaktion)
  • Versioniert gesamte Verzeichnisstruktur
  • optimierte/effiziente Speicherung und Übertragung
  • Integration in Webserver möglich

git:

  • Verteiltes System, flexibles Konzept
  • Ausgelegt für massives, billiges Branching
  • Operationen primär lokal
  • Skaliert (Funktionsumfang, Verteilung, Grösse)
  • Integration in Web-Apps
  • Erfordert ein solides Konzept bei verteiltem Einsatz

Was sind die Vorteile eines automatisierten Build Prozesses?

Vorteile:

  • Automatischer Ablauf, keine Interaktion nötig
  • reproduzierbare Ergebnisse
  • Lange Builds automatisch über Nacht laufen lassen
  • unabhängig von IDE

Nachteile:

  • eher sturer, unflexibler Ablauf
  • Abhängigkeit von Shell und Plattform (OS)
  • aufwändige Wartung und Erweiterung

Typische Aktionen während Programmierung:

  • Binaries erstellen für Deployment.
  • Testfälle ausführen, Test-Report erstellen.
  • Qualitätssicherung (Codeanalyse, Metriken etc.).
  • Distributionen zusammenstellen und Deployment etc.

Welche Build-Werkzeuge gibt es?

make:

  • für C/C++ Projekte
  • hohe Flexibilität

Ant (alt und bewährt, Java mit XML)
Maven (populär, etabliert, Java mit XML)
Buildr (neu, Ruby-Script)
Gradle (poluär, neu, Groovy-Script mit DSL)
Bazel (von Google, Java mit Python-like Scripts)

Wie funktioniert Apache Maven?

Maven selbst definiert nur die POM-Struktur und die LIfecycle Phasen
Rest wird von dynamisch geladenen Plugins erledigt --> flexibel und erweiterbar.

Lifecycle phases:

  • validate (Validiert die Projektdefinition)
  • compile (kompiliert die Quellen)
  • test (Ausführen der Unit Tests)
  • package (erstellen von JAR, EAR, etc.)
  • verify (Integrations-Tests ausführen)
  • install (Deployment im lokalen Repo)
  • deploy (Deployment im zentralen Repo)

Was ist Dependency Management (DM)?

  • Beschreibt die Organisation udn die Techniken für den Umgang mit Abhängigkeiten zu anderen Modulen (Package, Library, Bundle, Komponente)
  • Interne (eigenes Projekt) und externe Abhängigkeiten möglich
  • Es gibt öffentliche Repositories für das Hosting
    • Firmen haben oft eigene Repos (als lokaler Spiecher und Mirror von öffentlichen Repos) --> performanter

Wie funktioniert DM mit Java und Maven?

"maven coordinates" beschreiben die Abhängigkeiten, sind im POM hinterlegt:

  • GroupId: Reverse Domain Name + Zusätz (ähnlich Java Package Name), bsp. ch.hslu.vsk
  • ArtifactId: Entspricht häufig dem Namen des Projektes bzw. den darin enthaltenen Modulen, bsp. stringpersistor-api
  • Version: Version der dependency

Zusätzlich wird beim einbinden der Dependency die "scope" angegeben (compile, test, runtime, ..).

Wie ist semantic versioning aufgebaut?

Versionsnummer: Major.Minor.Bugfix

Major: API Veränderung --> nicht rückwärtskompatibel
Minor: Erweiterung in der API, vollständig rückwärtskompatibel
Bugfix: Korrekturen, Änderungen in der Implementation --> rückwärtskompatibel

Wie funktioniert die Versionierung mit Snapshots?

Anstelle einer neuen Build-Version nach jedem Build, wird der Appendix -SNAPSHOT verwendet:

  • Version gilt als erneuerbar und noch nicht stabil --> in Entwicklung
  • Bei jedem Build wird die Nummer inkrementiert
  • Im Repo mit Timestamp versehen
  • bsp. 4.0.0-SNAPSHOT --> noch nicht veröffentlichte/fertiggestellte Version 4.0.0

Wie werden Dependencies in Multi-Modulen verwendet?

Wenn eine Dependency in mehreren Sub-Modulen benötigt wird, kann im Master-POM eine generelle Definition gemacht werden (im Tag "dependencyManagement"). Sub-POMs geben dann nur noch groupId und artifactId an --> Version kann zentral geändert werden.

Was sind "transitiv dependencies"?

Abhängigkeiten, welche selbst weitere Abhängigkeiten definiert haben.

Maven kann diese selbständig auflösen.

Wie werden Java Module deployed?

Meistens als JAR und folgenden Artifkaten:

  • POM (Metainfos)
  • JAR (Binary)
  • JavaDoc
  • Source
  • + Hashes zu allen Artifakten

Öffentliche Repos sind sehr restriktiv (keine Änderungen, kein Löschen möglich).

In Firmen wird das Deployment meist über einen Buildserver ausgeführt.

Was ist ein Buildserver?

  • Serversoftware, welche einen automatisierten Build eines Projekts ausführt und die Resultate zur Verfügung stellt.
  • Auslösung des Builds durch:
    • Änderungen im SCM
    • Automatisch durch Zeitsteuerung
    • Manuell durch Anwender
  • Vorteile:
    • Keine manuellen, repetitiven Arbeiten vom Entwickler nötig
    • Häufigere Verifikation des Builds
    • Infos über den Entwicklungsprozess

Welche Beispiele von Build Servern gibt es?

Open Source:

  • Jenkins/Hudson (sehr populär)
  • CruiseControl (alt)
  • Continuum
  • Go (modern)

Kommerziell:

  • TeamCity (funktional, skalierbar)
  • Bamboo (gute JIRA Integration)

Cloud:

  • Travis CI
  • CloudBees

Welche möglichen Implementierungen von Build-Servern gibt es?

Variante 1 (klassische Produkte):

  • Konfiguration vollständig von Projekt getrennt
  • Konfiguration auf dem Build-Server
  • --> Gewaltentrennung

Variante 2 (Cloud-/Hosting-Produkte):

  • Konfiguration im Projekt hinterlegt
  • Konfiguration durch Entwickler
  • Weniger restriktiv 
  • --> Mehr Freiheit und Eigenverantwortung

Wie werden Build-Server eingesetzt?

  • Build-Server setzt andere Technologien voraus:
    • Automatisierte Builds (z.B. mit Maven, Gradle)
    • Einsatz eines SCM
  • Saubere Aufgabentrennung ist wichtig:
    • Wann wird ein Build ausgeführt --> Buildserver / Anwender
    • Was wird gebaut --> SCM
    • Wie wird gebaut --> Buildautomatisation (durch Buildtools z.B. Maven, Gradle)
    • Wohin gehen die Artefakte --> Buildserver / Binary-Repo

Buildarten:

  • Continuous Builds:
    • Build, wenn Änderung im SCM
    • Für schnelle, möglichst kurze Builds
    • --> Schnelles Feedback für Entwickler
  • Nightly Builds:
    • Build automatisch ausgeführt, zeitgesteuert
    • Für umfangreiche, lange Builds und zeitintensive Tests / Metriken
    • --> Am Morgen steht ein umfangreiches Resultat zur Verfügung
  • Release Builds:
    • Manuell ausgelöst
    • Für eine auslieferbare Version, im SCM getaggt
    • --> Reproduzierbarkeit gewährleisten

Was hat CI (Continuous Integration) für Ziele?

  • Immer ein lauffägies Produkt (Buildresultat) zu haben
  • Fehler möglichst schnell erkennen
    • Durch automatisierte Unit- und Integrationstests sowie Kompiler, Classpath, Codeprüfungen, etc.
  • Im Team parallel entwickeln und den Überblick nicht zu verlieren, den Integrationsaufwand zu minimieren und über den aktuellen Zustand auf dem laufenden sein.

Was sind die 10 Praktiken der CI?

  1. Einsatz eines SCM
  2. Automatisierter Buildprozess (Build auf sauberer Maschine, immer aktuelle Versionen verwenden, Testfälle ausführen)
  3. Automatisierte Testfälle (fehlerhafte Implementationen aufdecken, Performance Tests)
  4. Alle ändern den Quellcode auf dem Hauptzweig (Features/Branches nur wenn nötig)
  5. Bei einer Änderung wird automatisch eine Build durchgeführt
  6. Der Buildprozess muss schnell sein. (Allenfalls schneller (schlanker) und langsamer (umfangreicher) Build gestaffelt ausführen)
  7. Auf/mit Kopien der produktiven Umgebung testen. (Hardware, OS, Runtime, Netzwerk, ..)
  8. Einfacher Zugriff auf aktuelle Buildartefakte. (Über Buildserver und ein zusätzliches binäres Repo)
  9. Offensive Information über den aktuellen Zustand
  10. Automatisches Deployment (ermöglicht schnelle Systemtests)

Was sind die Vorteile von Entwurfsmustern?

Muster / Konzepte (z.B. Handshaking) bleiben über lange Zeit gleich --> gleiches Verständnis unter Entwicklern, gut erpropt, Sprach-Unabhängig

In welche Klassifizierungen werden Entwurfsmuster eingeteilt?

Klassifizierung nach Zweck:

  • Erzeugungsmuster (Creational Patterns)
  • Strukturmuster (Structural Patterns)
  • Verhaltensmuster (Behavioral Patterns)

Weitere Einteilung:

  • Klassenmuster: Legen Beziehungen bereits zum Kompilierzeitpunkt fest
  • Objektmuster: Beziehungen sind zur Laufzeit dynamisch veränderbar

Was sind Erzeugungsmuster und welche Beispiele gibt es?

  • Abstrahieren die Erzeugung von Objekten (Typ, Zeitpunkt, Art --> Kontext, Konfiguration, etc.)
  • Delegation der Erzeugung an andere Objekte (Fabrik-Konzept --> Objekt anfordern, Details zur Instanziierung und Konfiguration interessieren aber nicht)

Beispiele:

  • Abstrakte Fabrik (Abstract Factory, Kit)
  • Erbauer (Builder)
  • Fabrikmethode (Factory Method, Virtaul Constructor)
  • Prototyp (Prototype)
  • Einzelstück (Singleton)

Was sind Strukturmuster und welche Beispiele gibt es?

  • Fassen Objekte (oder Klassen) zu grösseren oder veränderten Strukturen zusammen.

oder

  • Erlauben unterschiedliche Strukturen einander anzupassen und miteinander zu verbinden.

Beispiele:

  • Adapter (Adapter, Wrapper)
  • Brücke (Bridge, Handle/Body)
  • Dekoriere (Decorator, Wrapper)
  • ..

Was sind Verhaltensmuster und welche Beispiele gibt es?

  • Beschreiben die Interaktion zwischen Objekten
  • Legen die Kontrollflüsse zwischen den Objekten fest.
  • Zuständigkeit und/oder Kontrolle delegieren.

Beispiele:

  • Beobachter (Observer)
  • Iterator (Iterator, Cursor)
  • Strategie (Strategy)
  • ..

Was ist das Singleton Pattern?

  • Gewährleistet, dass nur 1 Objekt einer Klasse erzeugt werden kann
  • Ist eine Erzeugungsmuster
  • Führt zu einer starken Kopplung, Austausch schwierig

Was ist das Fassade Pattern?

  • Stellt eine einheitliche, zusammengefasste Schnittstelle zu mehreren Sub-Schnittstellen zur Verfügung.
  • Ist ein Strukturmuster
  • Kennt die Subklassen und kann Anfragen delegieren
  • Subsysteme kennen die Fassade nicht.
  • Fassade darf nur delegieren, hat sonst keine Funktion

Was ist das Strategy Pattern?

  • Ermöglicht die Verwendung von mehreren Implementationen über die gleiche Schnittstelle / Abstrakte Klasse
  • Ist ein Verhaltensmuster und objektbasiert
  • Client / Context besitzt eine Referenz auf die konkrete Strategie, stellt eine Datenschnittstelle für die Strategien zur Verfügung.
  • Strategien selbst greifen allenfalls auf den Context zu (für die Daten)
  • Ermöglicht die Zusammenführung von verwandten Klassen, welche sich nur im Verhalten unterscheiden

Was ist das Observer Pattern?

  • Definiert eine Abhängigkeit zwischen einem Subjekt (dessen Zustand ändern kann) und einer Menge von Beobachtern (welche über die Zustandsänderung informiert werden sollen)
  • Ist ein Verhaltensmuster, objektbasiert
  • Subjekt verwaltet seine Beobachter, bietet Methoden zur An- und Abmeldung
  • Beobachter definiert eine Benachrichtigungsschnittstelle
  • Verwendet, wenn eine lose Kopplung der Beobachter bestehen soll oder wenn die Anzahl Beobachter irrelevant ist (z.B. MVC)
  • In Java wird das Event/Listener Pattern verwendet
    • Verwendet Interfaces --> keine Vererbung vom abstrakten Subjekt / Beobachter nötig

Lernen