Referenzarchitekturen für Web-Applikationen Finale Version

Werbung
Referenzarchitekturen für Web-Applikationen
Finale Version
Autoren:
Michalis Anastopoulos
Tim Romberg
Kennung
refarch_final
Klassifikation
Version
1.0
20. Dezember 2001
Das diesem Bericht zugrundeliegende Vorhaben wurde mit Mitteln des Bundesministerium für Wirtschaft und Technologie
unter den Förderkennzeichen 16IN0047
und 16IN0048 gefördert. Die Verantwortung für den Inhalt dieser Veröffentlichung
liegt bei den Autoren.
Inhalt
1 Einführung ....................................................................................................................7
2 Analyse von Architekturanforderungen .......................................................................9
2.1 Einteilung der Anwendung nach den Hauptkritieren..........................................9
2.2 Quantitative Analyse.........................................................................................11
3 Architektur-Überlegungen..........................................................................................15
3.1 Überlegungen zur physikalischen und Prozeß-Sicht der Architektur ...............15
3.2 Überlegungen zur logischen Sicht und Entwicklungssicht der Architektur .....27
4 Notationsformen für den Architekturentwurf.............................................................33
4.1 UML Implementierungsdiagramme..................................................................33
4.2 Modellierung von Web-Architekturen..............................................................35
5 Referenzarchitekturen.................................................................................................39
5.1 2-Tier.................................................................................................................39
5.2 Enterprise (N-Tier)............................................................................................40
5.3 XML-Pipe .........................................................................................................46
5.4 Content Management ........................................................................................48
6 Literatur ......................................................................................................................50
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Einführung
1
Einführung
Neben der Wahl von leistungsfähigen Standardprodukten wie Entwicklungs- und
Laufzeitumgebung ist in der Anfangsphase eines Entwicklungsprojekts die Wahl
einer leistungsfähigen Software-Architektur entscheidend.
Software-Architektur enthält nach [Boehm et al. 1995]:
• „a collection of software and system components, connections and constraints
• a collection of system stakeholder’s need statements
• a rationale, which demonstrates that the components, connections and contraints
define a system that, if implemented, would satisfy the collection of system stakeholder’s need statements”
Software-Referenzarchitekturen haben das Ziel, die Entwicklung von Softwarefamilien zu unterstützen.
Wie in [Kru95] ausgeführt, kann sich Architektur auf verschiedene Systemaspekte
beziehen. Zu unterscheiden sind die vier Sichten
• Logische Sicht
• Entwicklungssicht
• Prozeßsicht und
• Physikalische Sicht
Die logische Sicht macht Aussagen über die logische Entitäten der Anwendungsdomäne und ihre Beziehungen. Die Entwicklungssicht macht Aussagen über die in der
Entwicklung entstandenen Software-Artefakte. Diese beiden Sichten können zusammen als statische Sicht bezeichnet werden. Zur Laufzeit sind dagegen die laufenden
Prozesse interessant (Prozeßsicht) und die physischen Einheiten wie Server und
LAN-Verbindungen, auf denen die Software eingesetzt wird (Physikalische Sicht).
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
7
Einführung
Abbildung 1:4+1
Sichten auf SoftwareArchitekturen
Bei unserer Untersuchung wurde uns schnell klar, daß es die Referenzarchitektur für
Web-Anwendungen schlechthin nicht geben kann. Zu unterschiedlich sind die Anforderungen von Shops, Auktionshäusern oder Diskussionsforen. Zu unterschiedlich
sind auch die uns bekannten und empfehlenswerten Realisierungsformen. Die Variabilität der Referenzarchitekturen ist dabei eine Antwort auf die Variabilitäten der großen Domäne Web-Anwendungen, wie sie unsere Kollegen [John, Andriessens 2001]
untersucht haben.
Im folgenden Teil Analyse von Architekturanforderungen zeigen, wir, dass drei,
maximal vier dieser Variabilitäten ausreichen, um die wesentlichen Anforderungen
an die Referenzarchitektur zu erfassen und das Skalierungsverhalten zu charakterisieren. Danach zeigen wir, wie sich durch eine quantitative Analyse die kritischen Komponenten ermitteln lassen.
8
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Analyse von
Architekturanforderungen
2
Analyse von Architekturanforderungen
2.1
Einteilung der Anwendung nach den Hauptkritieren
Auf die zu wählende Referenzarchitektur wirken sich vor allem die Variabilitäten in
den von [John, Andriessens 2001] so genannten „horizontalen Domänen“ aus. So
z.B.
• in der Teildomäne Informationsaufbereitung: Sind die angezeigten Informationen statisch oder dynamisch? Bei einer dynamischen Informationsaufbereitung
ist die darzustellende Information von Eingaben des Benutzers abhängig.
• in der Teildomäne Session Management : Gibt es Sitzungszustand (Session
State) und ist dieser so umfangreich, dass er nicht allein in der URL oder in
einem Cookie gespeichert werden kann?
• in der Teildomäne Benutzerinformationen : „Kennt“ die Anwendung ihre
Benutzer, z.B. in Form eines Benutzerprofils, oder nicht?
• in der Teildomäne Transaktionsmanagement : Findet konkurrierender Schreibzugriff auf Daten von mehreren gleichzeitigen Sessions statt?
Nach unseren Beobachtungen sind diese vier Punkte die wesentlichen Variabilitäten,
die zur Wahl einer bestimmten Referenzarchitektur zur Realisierung der WebAnwendung führen. Dies ist besonders in frühen Phasen eines Projekts sehr interessant, denn die Referenzarchitektur beantwortet gleichzeitig die Frage nach den notwendigen Infrastrukturkomponenten und nach dem Skalierungsverhalten.
Abbildung 2:Features von BeispielAnwendungen
Dynamische Inhalte Sitzungszustand
Benutzerinformation Transaktionen
Spiegel Online (Nachrichten) -
-
-
-
Yellow Map (Branchen-verze-+
ichnis)
-
-
-
Bahnauskunft (Komplexere
Abfragen über mehrere
Seiten)
+
+
-
-
Amazon (Buchhandel)
+
+
+
+ (nur Bestellvorgang)
Online-Banking
+
+
+
+
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
9
Analyse von
Architekturanforderungen
Die vier Variabilitäten sind dabei nicht unabhängig. So haben Anwendungen mit
umfangreichem Sitzungszustand notwendigerweise dynamische Inhalte. Theoretisch
sind zwar viele Kombinationen denkbar. Sowohl von der praktischen Realisierung
(siehe obere Tabelle) als auch von den typischen Features der Standardumgebungen
her ergibt sich aber eine Ordnung gemäß der ansteigenden technischen Komplexität,
wie sie das folgende Feature-Diagramm zeigt.
Abbildung 3:Alternative Features der
Webdomäne
Webanwendung
Statische Inhalte
Dynamische Inhalte
Ohne Sitzungszustand
Mit Sitzungszustand
Ohne Benutzerinformation
Ohne Transaktionen auf
gemeinsamen Daten
Mit Benutzerinformation
Mit Transaktionen auf
gemeinsamen Daten
Die erste Variabilität mag trivial erscheinen. Verschiedentlich wurde aber über Firmen berichtet, die sich für ihre Webpräsenz Java-Applikationsserver mit DreiSchichten-Architektur im Wert von mehreren 10 000 Euro angeschafft haben,
obwohl ein Content Managment System die Anforderungen viel besser erfüllt hätte.
(Ein Content Management System kann nur in sehr einfacher Form Seiten dynamisch
generieren - z.B. durch das Zusammensetzen aus mehreren Komponenten oder als
Ergebnisliste von Suchen.) Auch bei vielen anderen Anwendungen gibt es weite
Bereiche, in denen die angezeigten Informationen im wesentlichen statisch sind. Hier
macht es Sinn, den statischen Teil soweit möglich vom dynamischen zu trennen und
den statischen Teil in einer einfacheren Architektur zu realisieren.
Von einer „Anwendung“ sprechen wir natürlich eigentlich nur, wenn es auch einen
dynamischen Teil gibt. Von der Infrastruktur her ergibt sich daraus fast immer die
Notwendigkeit, eine Datenbank einzusetzen, um die Informationen schnell und flexibel zusammenstellen zu können. Alle Referenzarchitekturen, für die dies zutrifft,
haben daher gemeinsam eine Präsentationsschicht (oben dargestellt), die die generierten Inhalte optisch aufbereitet und eine Form der persistenten Ablage der zugrundeliegenden Daten in einer Datenbank (unten dargestellt).
Die zweite Variabilität, umfangreiche Session-Daten oder nicht, hat große Auswirkungen auf die zu wählende Referenzarchitektur. Die verschiedenen Standardumgebungen unterscheiden sich wesentlich darin, wie sie die Session-Daten halten, gegen
Ausfälle sichern, und nach Ablauf einer Timeout-Periode gezielt „vergessen“.
10
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Analyse von
Architekturanforderungen
Die dritte Variabilität, Benutzerdaten oder nicht, beeinflußt die Architektur von den
notwendigen Komponenten her nur wenig. Die Architektur muß lediglich vorsehen,
wo die benutzerbezogenen Daten persistent abgelegt werden. Diese Daten lassen sich
gut partitionieren, da für eine laufende Session im Regelfall nur die Daten des entsprechenden Benutzers benötigt werden. In einer Bankanwendung mit 2000 Konten
können z.B. Kontenbewegungen der ersten 1000 Konten auf dem einen Server, die
der letzten 1000 Konten auf dem anderen Server gehalten werden. Dies wäre z.B.
nicht sinnvoll bei den 2000 Artikeln eines Katalogs. Die Größe der Datenbank wird
bei solchen Anwendungen stark von der Anzahl der Benutzer getrieben. Für die
Anzahl der Zugriffe ist dagegen eher die Anzahl der gleichzeitigen Sessions bestimmend. Wie man dies genau abschätzen kann, wird im nächsten Kapitel beispielhaft
gezeigt.
Die vierte Variabilität betrifft gerade die Daten, die mehrere Sessions potentiell
gemeinsam benutzen. Es kann sich dabei um Katalog- oder Preisdaten handeln, die
lediglich lesend verwendet werden. Oder es finden eben tatsächliche Transaktionen
auf den Daten statt, wie z.B. Gebote bei einer Auktion. Diese Transaktionen stellen
insbesondere dann eine Herausforderung dar, wenn die vielen Sessions auf vielen
Servern verteilt laufen. Es muß eine Synchronisation stattfinden, deren Aufwand mit
der Anzahl der Server steigt und so zu einem unterproportionalen Skalierungsverhalten des Gesamtsystems führt. Um diesen Effekt möglichst gering zu halten, bieten die
unterschiedlichen Standardumgebungen unterschiedliche intelligente Mechanismen
an.
2.2
Quantitative Analyse
Oft werden die Laufzeiteigenschaften eines Systems von der Last auf einige wenige
Komponenten bestimmt. [Menascé, Almeida 2000] zeigen einige quantitative
Modelle, die es erlauben, das Benutzerverhalten, die daraus resultierende Last
und den Ressourcenverbrauch bei Webanwendungen zu ermitteln. Im folgenden zeigen wir ein typisches Vorgehen für eine Anwendung zur Reservierung von Flugtickets.
Die minimale Anwendung besteht aus den drei Use Cases Profil anlegen, Flug
suchen & buchen und Flug stornieren. Nehmen wir an, sie bestehen jeweils aus den
folgenden Schritten:
Profil anlegen
1. Name & Rechnungsadresse
2. Bankverbindung
Flug suchen und buchen
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
11
Analyse von
Architekturanforderungen
1. Anmeldung
2. Angabe Start, Ziel, Datum
3. Auswahl Flug
4. Reservierung von Plätzen (Transaktion!)
5. Reservierung bestätigen
Flug stornieren
1. Anmelden
2. Anzeige gebuchter Flüge
3. Auswahl Flug
4. Stornieren
Um die beschriebene Analyse durchführen zu können, ist zunächst eine Modellierung
der Web-Seiten erforderlich, über die die Use-Cases abgewickelt werden können. Die
Unified Modeling Language stellt nur eine Möglichkeit dar, dies zu tun. Wir wollen
im Folgenden nur den zweiten Use-Case betrachten, da er die wichtige Transaktion
der Reservierung eines Platzes enthält. Das Ergebnis der Modellierung könnte wie
folgt aussehen:
Abbildung 4:Modell
der Webseiten für den
Use Case „Flug
suchen & buchen“
Anmeldung
Angabe Start,
Ziel, Datum
Verfügbare
Flüge
Angaben zur
Reservierung
Flug
Detailinfo
Reservierung
eingebucht
Reservierung
möglich. Bitte
bestätigen
Dies stellt natürlich nur einen sehr vereinfachten Ablauf dar, da in der Praxis noch
wesentlich mehr Zweige existieren dürften. Auch sind in manchen Fällen mehrere
Browserfenster zu berücksichtigen.
Im zweiten Schritt überlegt man sich, welche Komponenten notwendig sind, um die
erforderlichen Informationen zu generieren oder die Entscheidungen (durch Rauten
symbolisiert) zu treffen.
Abbildung 5:Verwendete Komponenten
12
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Analyse von
Architekturanforderungen
Verfügbare
Flüge
Anmeldung
Angabe Start,
Ziel, Datum
Angaben zur
Reservierung
Flug
Detailinfo
Reservierung
eingebucht
Reservierung
möglich. Bitte
bestätigen
Flüge &
Tarife
Benutzerprofile
Flughäfen
Plätze &
Reservierungen
Im vorliegenden Beispiel wird bei der Anmeldung eine Komponente Benutzerprofile
benötigt, um zu entscheiden, ob die Anmeldung gültig war oder nicht. Bei der
Angabe des Starts und Ziels werden Auswahllisten mit Hilfe der Komponente Flughäfen gefüllt. Die Komponente Plätze & Reservierungen stellt über eine Leseschnittstellen verfügbare Plätze zur Verfügung und erlaubt über eine Schreibschnittstelle das
Buchen eines Platzes.
Die Last auf jede dieser Komponenten kann nun abhängig von der Anzahl der begonnenen Sitzungen pro Zeiteinheit ermittelt werden, wenn man die Übergangswahrscheinlichkeiten zwischen den Webseiten kennt, d.h. die Wahrscheinlichkeit, dass ein
Benutzer einen bestimmten Link wählt oder eine bestimmte Entscheidung vom
System getroffen wird.
Man erhält dann nämlich eine Markov-Kette des Benutzerverhaltens, oder, wie
[MeA00] es nennen, einen Customer Behavior Model Graph. Über die Überlegung,
dass jeder Benutzer, der eine Webseite aufruft, sie in irgendeiner Form wieder verlassen muss (und sei es durch Schließen des Browsers), kann man dann die Häufigkeit
der Seitenaufrufe und damit die Last auf die Komponenten leicht bestimmen. In diesem Beispiel gehen wir davon aus, daß die Wahrscheinlichkeiten nur vom aktuellen
Zustand abhängen, und nicht von dem Pfad, auf dem er erreicht wurde, was in der
Praxis natürlich komplexer sein kann.
Im vorliegenden Beispiel schätzt man, dass in 80% der Fälle die Anmeldeinformationen korrekt sind. 90% aller Benutzer entscheiden sich nach der Anmeldung, einen
Flug nachzufragen (10% brechen ab). In der Liste der verfügbaren Flüge ist zu 60%
ein Flug dabei, den der Benutzer sich im Detail ansieht. Und so weiter.
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
13
Analyse von
Architekturanforderungen
Wenn man nun davon ausgeht, dass pro Stunde 10 000 Benutzer frisch auf die Seite
Anmeldung kommen, so folgt daraus, dass im Gleichgewicht pro Stunde 10 000
Benutzer diese Seite verlassen müssen. Das bedeutet, dass die Seite Anmeldung
12 500 Mal pro Stunde aufgerufen wird (10 000 geteilt durch 0,8).
Wenn man wissen möchte, wie oft die Seite Angabe Start, Ziel, Datum aufgerufen
wird, so kann man diese Häufigkeit zunächst mit h bezeichnen und sich klarmachen,
dass im Gleichgewicht h = 10 000 + 0,9 * 0,4 * h gilt. Die Seite wird nämlich von den
10 000 Benutzern pro Stunde aufgerufen, die gerade frisch von der Anmeldung kommen sowie 0,9 * 0,4 * h mal von den Benutzern, die von der Seite Verfügbare Flüge
enttäuscht zurückkehren. Daraus folgt h = 10 000 / 0,64 = 15 625. Die anderen Häufigkeiten können ähnlich berechnet werden.
Abbildung 6:Berechnung der Last
10 000 / h
Verfügbare
Flüge
Anmeldung
0,4
Angaben zur
Reservierung
Reservierung
eingebucht
0,7
0,6
0,9
0,2
Angabe Start,
0,8 Ziel, Datum
12 500 / h
Flug
Detailinfo
0,3
Reservierung
möglich. Bitte
0,7 bestätigen
0,5
14 062 / h
8 437 / h
2 953 / h
15 625 / h
8 437 / h
Flüge &
Tarife
Benutzerprofile
Flughäfen
Plätze &
Reservierungen
Man erkennt nun leicht, dass die eigentlichen Transaktionen nur mit einer gemäßigten Rate von 2 953 pro Stunde getätigt werden, also weniger als eine pro Sekunde, so
dass dies vermutlich ein Server gut bewältigt. Angaben über Flughäfen und Flüge
werden dagegen sehr oft abgefragt, so daß es sich evtl. lohnt, diese Daten zu replizieren, zumal sie nur gelesen werden.
14
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Architektur-Überlegungen
3
Architektur-Überlegungen
Von den Herstellern von Standardumgebugen werden eine ganze Reihe von Referenzarchitekturen vorgestellt, die jeweils auf deren Standardumgebung abgestimmt
sind (siehe [MIC-5], [MIC-6], [SUN-1]). Verschiedentlich wird aber über große
Schwierigkeiten berichtet, größere Anwendungen nach diesen Vorgaben zu realisieren. Auch sind die Empfehlungen auch nur eines Herstellers oft nicht einheitlich und
ändern sich häufig. Man findet andererseits bei verschiedenen Herstellern ähnliche
Überlegungen mit jeweils unterschiedlicher Terminologie.
Als ersten Schritt auf dem Weg zu Referenzarchitekturen haben wir immer wiederkehrende Überlegungen bzw. Entwurfsmuster gesammelt, die sich z.T. in den Frameworks der Hersteller wiederfinden oder in Praxisprojekten erfolgreich verwendet
wurden. Diese Muster können auch unabhängig von den in Kapitel 4 vorgestellten
Referenzarchitekturen benutzt werden.
3.1
Überlegungen zur physikalischen und Prozeß-Sicht der Architektur
In diesen Sichten stehen die Anforderungen Performance, effizienter Einsatz von
knappen Ressourcen und Ausfallsicherheit im Vordergrund.
3.1.1
Zwischenspeicherung (allgemein)
Bevor Clients Serverressourcen nutzen können, müssen sie sie zuerst aktivieren bzw.
initialisieren. Das heißt im Falle von Serverkomponenten, daß eine Instanziierung
nötig ist, die der Komponente ihren Laufzeitcharakter vergibt. Im Falle von Datenbanken ist ein Verbindungsaufbau nötig.
Bei den im Web üblichen hunderten oder tausenden von gleichzeitigen Verbindungen
ist es unmöglich, pro Client-Verbindung beispielsweise eine Datenbankverbindung
aufrecht zu erhalten. Andererseits ist es bei vielen Ressourcen zu zeitaufwändig, sie
bei jedem Request wieder neu zu initialisieren
Um eine akzeptable Systemperformanz zu erreichen, kommen sogenannte Ressource
Pools zum Einsatz. In diesen Pools werden aktive Ressourcen zwischengespeichert
und wiederverwendbar gemacht. Die Ressourcen im Pool benötigen auch eine Initialisierung, bevor sie genutzt werden, allerdings erfolgt sie sehr schnell.
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
15
Architektur-Überlegungen
Wenn ein Client eine Ressource aktivieren will, wird zuerst der Zwischenspeicher
nach einer passenden, bereits aktivierten Ressource durchsucht und wenn sie vorhanden ist, wird sie angesprochen. Zudem kann eine Pool-Ressource gleichzeitig mehrere Clients bedienen. Wenn Ressourcen im Pool nicht mehr gebraucht werden, sind
sie Kandidaten für die Entfernung aus dem Pool.
Meistens werden derartige Mechanismen von Standardumgebungen angeboten. Das
heißt, daß die Ressourcen und darüber hinaus die betroffenen Entwickler sich nicht
um die Details der Zwischenspeicherung (z.B. Datenintegrität, Persistenz) und der
Nebenläufigkeit kümmern müssen. Dadurch ist der Prozeß transparent. Das heißt,
daß die Clients nicht wissen müssen, ob sie bereits aktivierte Ressourcen wiederverwenden oder ob sie diese Ressourcen selbst aktiviert haben.
Folgende Abbildungen1 illustrieren das Verhalten von Ressourcen, die an einem Pooling-Szenario teilnehmen.
Abbildung 7:Ressource Pooling:
Zustandsdiagram
Ressource ist
passiv
<< von Infrastruktur angestoßen >>
Ressource vom Zwischenspeicher
entfernen
<<vom Client angestoßen>>
Ressource aktivieren
Ressource im Zwischenspeicher
<<vom Client angestoßen>>
Ressource ansprechen
Ressource ist
aktiv
Ressource
bedient Client
Ressource nicht mehr vom Client gebraucht
1
16
Diese Abbildungen sind nicht UML-konform.
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Architektur-Überlegungen
Abbildung 8:Ressource Pooling: Interaktionsdiagram
Client A
Client B
Infrastruktur
1: Aktiviere
Ressource
<<aktiviere>>
Aktive Ressource
2: Ressource
ansprechen
3:
aktiviere
Ressource
4: Ressource
ansprechen
Zu diesem Zeitpunkt wird
keine Ressource
aktiviert
3.1.1.1 Zwischenspeicherung von Datenbankverbindungen
Der vollständige Aufbau einer Datenbankverdindung ist eine zeitaufwändige Aufgabe. Eine Verbindung muß erstellt und initiliisiert werden. Dazu gehört beispielsweise das Auffinden der Datenbank und das Laden eines Treibers für den DBZugriff. Dann müssen Nutzer durch die Autorisierungs- und Authentifizierungsmechanismen gehen, bevor sie eine Abfrage starten können. Connection Pools kommen
zum Einsatz um die ständige Wiederholung dieser Tätigkeiten zu vermeiden.
Verbindungen mit Connection Pooling werden nach ihrem Aufbau, das heißt für
ODBC nach Vergabe eines eindeutigen Identifizierers für die Verbindung oder für
JDBC nach Instanziierung eines Verbindungdsobjektes, in einem Pool aufbewahrt.
Die Verbindung ist dann für mehrere Clients wiederverwendbar. Wenn ein Client eine
ähnliche Verbindung aufzubauen versucht, nutzt das System die bereits existierende
Verbindung im Pool. Wenn die Pool-Verbindung nicht mehr von Clients gebraucht
wird, wird sie nach einer bestimmten Zeit geschlossen und vom Pool entfernt.
Die Pooling-Technologie wird auch für Verbindungen im allgemeinen eingesetzt, das
heißt nicht nur für Datenbanken. So nutzt der Weblogic Applikationsserver von BEA
ein Pool für Verbindungen zwischen dem Microsoft Information Server, der in diesem Szenario statische HTML-Seiten liefert, und dem Weblogic Applikationsserver,
der hier die dynamischen Inhalte liefert.
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
17
Architektur-Überlegungen
3.1.2
Zwischenspeicherung von HTML-Seiten
Ein dynamische HTML-Seite enthält Anweisungen innerhalb des HTML-Quellcodes, die dynamisch kompiliert und ausgeführt werden, wenn ein Client die Seite
erfordert. Nach Ausführung aller Anweisungen entstehen die endgültigen Inhalte, die
dem Client zugeschickt werden.
Die Kompilierung und Ausführung dynamischer Seiten ist zeitaufwändig und das
führt oft zu inakzeptabler Performanz. Aus diesem Grund kommen Caches für
HTML-Seiten zum Einsatz.
Der Entwickler definiert für jede dynamische Seite, die Komponenten der Seite, die
zwischenzuspeichern sind. Diese Komponenten können entweder HTML-Layout
oder ein berechneter Wert sein.
Bei dynamischen HTML-Seiten kommen demnach zwei Arten von Caches zum Einsatz. Der Output- und der der Input-Cache. Im ersten Fall wird der endgültige
HTML-Inhalt, nämlich die Präsentation, zwischengespeichert . Im zweiten Fall werden Daten zwischengespeichert, die unterschiedlich darzustellen sind.
3.1.3
Replikation von Ressourcen
Die Replikation von Ressourcen wird zugunsten der Ausfallsicherheit und der Performanz angewendet. An der Stelle eines einzigen Server, der die verfügbaren Ressourcen verwaltet, werden zusätzliche Server eingesetzt, die Kopien von den Originalressourcen verwalten.
Es existieren zwei Arten von Replikation [Fel98]:
1. Aktive Replikation
Der Client sendet seine Anfrage sowohl an den Server mit der Originalressource als
auch an die Server mit den Repliken. Anschließend werden das Original und die
Repliken aktualisiert und die jeweligen Server senden eine Antwort zurück. Da alle
Repliken die Anfrage bekommen und da der Client üblicherweise auf die erste Antwort wartet, ist ein Ausfall transparent.
Voraussetzung für die aktive Replikation ist, daß die Client-Nachrichiten in der gleichen Reihenfolge bei den Servern ankommen. Dies erledigt meistens die Infrastruktur. Zugunsten der Konsistenz muß die Ressource entweder keinen Zustand zwischen
Operationen verwalten oder der eingenommene Zustand muß nur vom Initialzustand
und der Reihenfolge der bereits verlaufenen Zustände abhängen. Wenn beispielsweise der Zustand der replizierten Ressource auch vom Zustand des Servers abhängt,
auf dem sie läuft, ist keine Konsistenz zu erwarten.
18
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Architektur-Überlegungen
Folgende Abbildung illustriert die aktive Replikation.
Abbildung 9:Aktive
Replikation
Client
Server 1
Server 2
Server 3
1: Anfrage
2: Anfrage
3: Anfrage
4: Antwort
5: Antwort
6: Antwort
2. Passive Replikation
Bei der passiven Replikation, die heutzutage üblicher ist, wird ein Server als Primärserver gekennzeichnet und die restlichen Server als Backup-Server. Clients senden
Anfragen nur an den Primärserver, der anschließend entsprechend die Backup-Server
aktualisiert. Falls der Primärserver ausfällt, ist das System weiter funktionsfähig,
indem ein Backup-Server übernimmt.
In diesem Fall implementiert der Primärserver, nämlich die Infrastruktur, die Logik
für die Konsistenzhaltung der Backup-Server. Der Primärserver wartet auf eine
Bestätigung nach jeder Aktualisierung, die er auf einem Backup-Server versucht.
Nachdem die Backup-Server bestätigt haben, schickt der Primärserver die Antwort
an den Client.
Das ist die einfachste Möglichkeit, um Atomizität und Konsistenz zu gewährleisten.
Mit dieser Möglichkeit ist allerdings keine Erhöhung der Systemperformanz zu
erwarten. Im Hinblick darauf kommen Mechanismen für den Lastausgleich zum Einsatz, den wir nachfolgend behandeln.
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
19
Architektur-Überlegungen
Abbildung 10:Passive Replikation
Client
Primärserver
Backup 1
Backup 2
1: Anfrage
2: Aktualisiere
3: Aktualisiere
4: Bestätigung
5: Bestätigung
6: Antwort
3.1.4
Lastausgleich
Lastausgleichsmechanismen erweitern das Konzept der passiven Replikation, um
Skalierbarkeit und bessere Performanz, vor allem bei schreibenden Zugriffen, zu
erreichen.
In einem Lastausgleichsszenario existiert kein Primärserver sondern gleichberechtigte Server, die Bestandteil eines Serverblocks (oder -Cluster) sind. Die Rolle des
Primärservers spielen Stubs1 oder spezielle Lastausgleichskomponenten (Load
Balancers) [BEA-D].
Eine Client-Anfrage landet zuerst bei dem Load Balancer, der die Entscheidungslogik zur Auswahl eines Servers implementiert. Die Entscheidung ist mit der Last
sowohl auf der Komponenten- als auch auf der Netzwerkebene verbunden [Mic-E].
Der Load Balancer sorgt auch für die Haltung der Konsistenz zwischen den Repliken
im Cluster, wenn bei schreibendem Zugriff ein replizierter Zustand zu verändern ist.
Schließlich wird Ausfallsicherheit gewährleistet, indem der Load Balancer einen ausgefallenen Server nicht mehr berücksichtigt.
1
20
Ein Stub ist typischerweise einer Komponente zugeteilt und übernimmt die Ver- und Entpackung der transprortierten Daten.
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Architektur-Überlegungen
3.1.5
Trennung von Lese und Schreib-Schnittstelle (Bulk Read)
Eines der Grundprinzipien der Objektorientierung ist die Kapselung von Daten. Klassen implementieren dabei wohldefinierte Schnittstellen, über die die Daten eines
Objekts gelesen oder geschrieben werden können.
Für persistente Daten verwenden Frameworks wie z.B. Enterprise JavaBeans das
Konzept der Business Objects, wie sie u.a. [Sut 1997] und [Eel 1998] vorgeschlagen
haben. Der Zugriff auf die persistenten Daten erfolgt dabei nicht über die DatenbankAPI, sondern über die Schicht der Business Objects, also Objekte einer objektorientierten Sprache. Der Verwender hat somit eine im Vergleich zum relationalen Modell
reichhaltigere, objektorientierte Sicht auf die Daten. Das Framework bzw. die Business Objects selbst sind dann dafür verantwortlich, die entsprechenden Transaktionen
auf der Datenbank durchzuführen.
In einer Umgebung, in der die Anwendung über mehrere Server physikalisch verteilt
werden soll, kann es aus mehreren Gründen ineffizient sein, Lese- und Schreibzugriffe über die gleiche Objektinstanz durchzuführen:
Als „Bulk Read“ Zugriffe werden Lesezugriffe bezeichnet, bei denen eine Menge
von Datensätzen der gleichen Tabelle ausgelesen werden muss. Diese Zugriffe sind
sehr typisch, wenn der Benutzer z.B. einen Artikel aus einer Liste aller Artikel auswählen soll. Bei einem klassischen Business Object-Ansatz müssten zunächst für
jeden Artikel der Liste eine Objektinstanz der Klasse Artikel instanziert werden, um
dann z.B. der Präsentationsschicht zu erlauben, die darin enthaltenen Daten auszulesen. Diese Instanzierungen können je nach Plattform sehr viel Zeit in Anspruch nehmen.
Das Problem verschärft sich, wenn in der Abfrage Daten aus verknüpften Objekten
gebraucht werden. Dies ist sehr ärgerlich, weil die relationale Datenbanktechnologie
hierfür schon lange sehr performante JOIN-Mechanismen bereitstellt.
Zweitens kommen die Überlegungen zur physikalischen Verteilung der kapselnden
Funktionalität zu sehr unterschiedlichen Ergebnissen je nachdem, ob es sich um
lesenden oder schreibenden Zugriff handelt.
Wie oben schon erwähnt, müssen transaktionale Schreiboperationen immer zwischen
den verschiedenen phyiskalischen Instanzen einer logischen Entität synchronisiert
werden, was die Verteilung nicht sehr effizient macht. Bei Lesezugriffen hingegen
läßt sich der Durchsatz durch Verteilung erheblich steigern.
Aufgrund dieser und anderer Schwierigkeiten wird von verschiedenen Autoren ([Hun
1998], [Hal 1997]) gefordert, den Business Object-Ansatz zugunsten anderer Ansätze
aufzugeben. Wo man sich aber aus anderen Gründen für ein Framework wie Enterprise JavaBeans entschieden hat, bietet sich eine getrennte Implementierung der
Lese-Schnittstelle an:
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
21
Architektur-Überlegungen
Man definiert also eine Klasse, die das eigentliche Business Object mitsamt seiner
transaktionalen (d.h. schreibenden) Business Methoden und der Gültigkeitsprüfungen darstellt. Daneben implementiert man eine Klasse, mit der die dahinterliegenden
Daten schnell in tabellarischer Form ausgelesen werden können. Falls das Framework keine inhärente Möglichkeit bietet, die Konsistenz zwischen diesen beiden
Klassen sowie dem Datenbankschema zu gewährleisten, kann man Codegenerierung
einsetzen (siehe unten).
3.1.6
Asynchroner Nachrichtenaustausch (Messaging)
Alle Serveroperationen, die Client-Komponenten aufrufen, sind in zwei Gruppen einzuordnen. In die synchronen und in die asynchronen Operationen. Im ersten Fall muß
ein Client gesperrt bleiben, bis die Antwort auf seine Anfrage von der Serverkomponente ankommt. Im zweiten Fall steht die Client-Komponente nach Abschicken einer
Nachricht weiter zu Verfügung. Diese Möglichkeit wird in erster Linie von den Messaging-Technologien unterstützt.
Zur Realisierung von asynchronen Operationen gibt es folgende Möglichkeiten:
– Einwegoperationen
– Callback
– Polling
– Asynchrones, ereignisgesteuertes Messaging
1. Einwegoperationen
Mit dem Standard-Nachrichtenaustausch (z.B. durch die Nutzung von StandardCORBA oder -Java) sind asynchrone Aufrufe durchaus möglich. Einweg-Operationen können beispielsweise asynchron sein. Diese Operationen werden dadurch
gekennzeichnet, daß die Client-Komponente eine Nachricht verschickt und auf keine
Antwort wartet. Eine typische Einweg-Operation ist eine Bestätigung.
2. Callback
Hier wird einer Einweg-Operation eine Referenz auf dem Client übergeben, so daß
der Server zu einem späteren Zeitpunkt den Client ansprechen kann (Callback).
Alternativ kann ein Client parallellaufende Threads nutzen, um blockierende Aufrufe
zu vermeiden. Das heißt, ein Thread verschickt die Nachricht und bleibt gesperrt, bis
eine Antwort da ist, während ein anderer, parallellaufender Thread sich um die restliche Funktionalität der Client-Komponente kümmert.
3. Polling
22
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Architektur-Überlegungen
Bei diesem Ansatz verschickt die Client-Komponente eine Nachricht und blockiert
nicht. Stattdessen übeprüft sie regelmäßig, ob der Server eine Antwort fertiggestellt
hat und wenn ja, nimmt sie diese Antwort auf. Die Überprüfung erfolgt eigentlich
auch als eine Nachricht, die diesmal synchron verschickt wird. Auch hier kann der
Einsatz von Threads sinnvoll sein.
Die bisher beschriebeneni Möglichkeiten sind allerdings mit Nachteilen behaftet. So
ist bei Einwegoperationen keine Zuverlässigkeit der Zustellung gewährleistet. Im
Falle von Callback & Threads muss komplizierter Code geschrieben werden. Polling
produziert viele Nachrichten, was die Netzwerkverbindungen und die Systemperformaz negativ beeinflußt.
4. Asynchrones, ereignisgesteuertes Messaging
Das asynchrone, ereignisgesteuerte Messaging kommt zum Einsatz, um genau diese
Probleme zu lösen. Mit dem ereignisgesteuerten Messaging ist also ein Nachrichtenaustausch mit folgenden Charakteristiken möglich:
• Asynchron: Sender müssen nicht blockieren
• Bidirektional: Sender und Empfänger tauschen Nachrichten basierend auf Ereignissen aus.
• Quality of Service: Der Messaging-Dienst schützt Nachrichten vor Ausfällen und
sorgt für den sicheren Nachrichtentransport. Zudem hat jeder Beteiligte grob- bis
feingranulare Kontrolle über die Qualität des Messaging. Er kann beispielsweise
auf verschiedenen Ebenen Prioritäten oder Timeouts sowie transaktionale oder
Persistenzattribute setzen.
Nachfolgend beschreiben wir Muster für das asynchrone Messaging. Die Ereignisverwaltung bezieht sich mehr auf funktionale Eigenschaften und deswegen behandeln wir sie im Abschnitt 3.2.
• Asynchronous Client Connector
Folgende Abbildung illustriert den Asynchronous Client Connector [Gom01]. Das
Muster nutzt eine Connector-Komponente, die zwei parallellaufende Stubs für die
aus- und eingehende Nachrichten enthält. Antworten aus dem Server werden erst in
einem Puffer gespeichert, von dem der Client sie empfangen kann.
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
23
Architektur-Überlegungen
Abbildung 11:Asynchronous Client Connector
<<Connector>>: Asynchronous Client Connector
<<Ressource>>
: Network
:Client Message
Input Buffer
4:send_reply
(Response)
:Client Return
Stub
:Client Call Stub
3:forward_reply
(PackedResponse)
2:forward_msg
(PackedMessage)
5:receive_response
(Response)
1:send_msg(Message)
<<Component>>
: Asynchronous Client
• Shared Queue
Warteschlangen (Queues) sind ein Standard-Feature von Messaging-Umgebungen.
Sender legen asynchron ihre Nachrichten in die Warteschlange und Empfänger nehmen Nachrichten von der Warteschlange heraus. Letzteres kann so bald wie möglich,
in Gruppen oder periodisch passieren.
Die Warteschlange wird gemeinsam und parallel von mehreren Sendern und Empfängern verwendet. Die Messaging-Infrastruktur (Queue Manager) sorgt für diese
Nebenläufigkeit jeder Warteschlange, die sie verwaltet, sowie für andere Dienste wie
Routing, Priorisierung und anderes. BEA Tuxedo (vgl. [BEA-A],[BEA-B]) und
Microsoft Message Queuing ( vgl. [Mic-A],[Mic-B]) sind Beispiele von MessagingUmgebungen, die Queues einsetzen.
Nachdem eine Nachricht empfangen und verarbeitet wurde, ist es üblich, daß Sender
und Empfänger Rollen tauschen, damit der Sender die Antwort auf seine Nachricht
empfangen kann. Diese Art der Kommunikation ist auch unter dem Begriff “Asynchrone Peer-To-Peer-Kommunikation” bekannt, da die Beteiligte selbständige gleichrangige Maschinen (Peers) sein können und nicht unbedingt Clients und Server.
24
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Architektur-Überlegungen
Abbildung 12:Message Queues
Sender
Empfänger
enqueue(message)
dequeue(message)
Queue
Manager
Queue
Manager
routing
authentication
prioritization
...
send
3.1.7
<<shared>>
Empfänger
Queue
dispatch
Verbindungslose Schnittstelle
Manche Komponenten haben Schnittstellen, in denen Methodenaufrufe im Kontext
der aktuellen Verbindung zum Client interpretiert werden müssen. Beispiel wäre ein
Warenkorb:
Warenkorb
+ArtikelHinzufügen(in ArtikelNr, in Anzahl)
+BestellungAbschliessen()
Die Methode BestellungAbschliessen ist nur im Kontext der Verbindung zu interpretieren. Wird sie von Client A aufgerufen, so werden genau die Artikel bestellt, die
Client A während seiner Verbindung mit der Methode ArtikelHinzufügen gewählt
hat. Ruft sie Client B auf, werden u.U. ganz andere Artikel bestellt.
Pro Verbindung muss die Komponente also entsprechende Serverressourcen belegen.
Falls die Komponente auf mehreren Servern läuft, müssen alle Anfragen eines
bestimmten Clients immer an die gleiche Instanz geleitet werden.
Bei einer, wie im Web typischen, sehr hohen Anzahl von Verbindungen skalieren solche Komponenten entsprechend schlecht. Besonders dann, wenn sie außerdem persistenten Zustand verwalten, und die in Abschnitt 3.1.3 Replikation von Ressourcen
beschriebenen Konsistenzprobleme auftreten. Komponenten, die eine hohe Anzahl
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
25
Architektur-Überlegungen
von Clients parallel bedienen müssen, sollten daher nach Möglichkeit mit verbindungslosen Schnittstellen konzipiert werden.
Die Forderung nach einer verbindungslosen Schnittstelle ist nicht gleichzusetzen mit
der Forderung nach einer zustandslosen Komponente, d.h. einer zustandslosen Implementierung.
Grundsätzlich läßt sich eine bestehende, verbindungsorientierte Schnittstelle auf drei
Arten in eine verbindungslose Schnittstelle umwandeln. Zur Illustration verwenden
wir die verbindungsorientierte Schnittstelle einer Leinwand, auf der verschiedene
Clients Linien und Kreise zeichnen können:
Leinwand
+SetzePinselFarbe(in Farbe)
+SetzePinselDicke(in Dicke)
+ZeichneRechteck(in Links, in Oben, in Rechts, in Unten)
+ZeichneKreis(in MitteX, in MitteY, in Radius)
(Dies eignet sich hier besser als der Warenkorb. Mit „in“ kennzeichnen wir Eingangsparameter.)
Die Methoden zum Zeichnen von Rechtecken und Kreisen verwenden hierbei einen
Pinsel, dessen Farbe und Dicke im Verbindungskontext festgelegt sind.
1. Methoden erweitern
Die Methoden werden so um Parameter erweitert, dass ihre Interpretation auch ohne
den Verbindungskontext möglich ist. Wie man sieht, können dadurch manche Methoden überflüssig werden:
Leinwand
+ZeichneRechteck(in Farbe, in Dicke, in Links, in Oben, in Rechts, in Unten)
+ZeichneKreis(in Farbe, in Dicke, in MitteX, in MitteY, in Radius)
2. Grobgranularere Methoden verwenden
Die Schnittstelle wird so umgebaut, dass dort, wo bisher mehrere zusammenhängende Aufrufe nötig gewesen wären, nun ein einzelner Methodenaufruf ausreicht:
26
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Architektur-Überlegungen
Figur
<<serialisierbar>>
+Farbe
+Dicke
+HinzufügenRechteck(in Links, in Oben, in Rechts, in Unten)
+HinzufügenKreis(in MitteX, in MitteY, in Radius)
Leinwand
+ZeichneFigur(in FigurByValue : Figur)
Grobgranulare Methoden haben dabei typischerweise komplexe Parameter, die wie
dargestellt mittels ByValue-Objekten oder XML-Dokumenten übertragen werden
können.
3. Verbindungszustand durch persistenten Zustand ersetzen
D.h. wir verwenden statt einem „Session“-Pinsel beliebig viele globale Pinsel:
Leinwand
+DefiniereGlobalenPinsel(in Farbe, in Dicke, aus PinselNr)
+ZeichneRechteck(in PinselNr, in Links, in Oben, in Rechts, in Unten)
+ZeichneKreis(in PinselNr, in MitteX, in MitteY, in Radius)
Während die ersten beiden Wege mehr Arbeit auf den Client verlagern, bringt der
dritte Weg oft nicht den gewünschten Effekt bezüglich Skalierbarkeit, da jetzt der
persistente Zustand - sprich, eine u.U. große Anzahl von globalen Pinseln - mit dem
entsprechenden Aufwand verwaltet werden muss.
3.2
Überlegungen zur logischen Sicht und Entwicklungssicht der Architektur
Hier stehen die Effizienz der Entwicklung und die Investitionssicherheit im Vordergrund
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
27
Architektur-Überlegungen
3.2.1
Trennung von Präsentations- und Geschäftslogik
Moderne Webapplikationen werden entwickelt, um eine Vielzahl unterschiedlicher
Benutzer zu unterstützen. Das heißt, daß die Benutzerschnittstelle stark variieren
kann, während die Geschäftslogik für die Erstellung der zu präsentierenden Informationen unverändert bleibt. Der Bedarf an einer Trennung zwischen Präsentations- und
Geschäftslogik wird dadurch deutlich.
Durch eine derartige Trennung ist die gleiche Geschäftlogik für viele Benutzerschnittstellen wiederverwendbar. Das fördert die Skalierbarkeit, da neue GUIs ohne
Aufwand unterstützt werden können. Die Duplizierung der selben Geschäftslogik für
jede Benutzerschnittstelle und der somit enstehende große Aufwand für Entwicklung,
Testen und Wartung werden vermieden. Durch die Trennung wird auch das Personal
besser ausgenutzt, da die GUI-Designer und die Entwickler der Geschäftslogik sich
getrennt auf ihre Arbeit konzentrieren können.
Das wohl bekannteste Entwurfsmuster, das die Trennung von Präsentation und
Geschäftslogik fördert, ist das Model View Controller [Gam95] oder MVC Muster.
Abbildung 13 illustriert dies [Sun-C].
• Das Modell repräsentiert Geschäftsdaten und -regeln. Falls sich eine Datenanderung ereignet, sorgt das Modell dafür, daß alle interessierten Views über diese
Änderung notifiziert werden. Dieser Notifizierungsansatz ist auch als PushModell bekannt. Alternativ wird das Pull-Modell eingesetzt, bei dem die View die
aktuellsten Daten durch einen Modellaufruf bekommt.
• Die View stellt die Modellinhalte dar und kann auf sie zugreifen. Sie ist verantwortlich für die Konsistenz zwischen den präsentierten Inhalten und den Modellinhalten. Deswegen muß sie entsprechend auf Modelländerungen reagieren. Die
View registriert auch Aktionen seitens des Nutzers und leitet sie an den Controller
weiter.
• Der Controller interpretiert Nutzerinteraktionen als Änderungen, die an dem
Modell vorgenommen werden müssen. Für die Ergebnisse dieser Änderungen
wählt der Controller eine geegnete View aus.
28
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Architektur-Überlegungen
Abbildung 13:MVC
Pattern
Model
Anfrage
-kapselt Applikationszustand
-reagiert auf Anfragen
-stellt Funktionalität der Applikation bereit
-informiert die Präsentation über Änderungen
Notifizierung
Zustandsänderung
View
-stellt die Modelle dar
-aktualisiert die Modelle
-leitet Nutzeraktionen an den Controller weiter
-erlaubt dem Controller eine View auszuwählen
Auswahl einer View
Nutzeraktionen
Controller
Aufruf
Ereignis
-definiert das Applikationsverhalten
-bildet Nuzeraktionen afdguf Modellaktualisierungen dar
-wählt eine View für Ergebnisse au
-je Funktionalität gibt es einen Controller
Im Web-Kontext erfährt MVC eine etwas andere Interpretation. Es ist auch hier sinnvoll, die fachliche Funktionalität (Modell), Präsentation (View) und Steuerung (Controller) in getrennten Klassen zu implementieren. Die Frameworks bieten dafür entsprechende Unterstützung - in Java lassen sich z.B. Präsentationskomponenten
relativ leicht mit Java Server Pages, Steuerungskomponenten mit Servlets und
Modelle mit Java Beans implementieren. Die Ereignisweitergabe funktioniert aber
etwas anders als oben dargestellt. Bei der Kommunikation über HTTP kann der Server keine Ereignisse an den Client schicken. Dies wäre bei u.U. Tausenden von Clients, die z.B. alle eine Sicht auf das gleiche Modell haben, auch kaum praktikabel.
Außerdem eignet sich HTML als Präsentationsformat nicht für Änderungen. Stattdessen geht die Kommunikation immer vom Client aus und bewirkt im Normalfall
einen Neuaufbau der Präsentation.
3.2.2
Codegenerierung und Aktive Repositories
Eines der wichtisten Ziele bei der Definition einer Architektur ist die leichte Erweiterbarkeit. Ein wichtiges Prinzip ist dabei die Lokalität von Änderungen. Damit ist
gemeint, dass typische Änderungsanforderungen Änderungen an möglichst wenig
Quellen erforderlich machen. Aktuelle Standardumgebungen erfüllen diese Anforderung im wesentlichen nicht.
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
29
Architektur-Überlegungen
Nehmen wir als Beispiel Enterprise JavaBeans und Feldlängen. Nehmen wir an, wir
hätten eine Entität „Kunde“ mit einem Feld „Nachname“. Die Länge dieses Feldes
wird einmal im Datenbankschema definiert. Die zugehörige Entity Bean sollte beim
Ändern des Nachnamens von vorneherein prüfen, ob die Länge zulässig ist, und entsprechend darauf reagieren. Drittens sollte auf der Webseite, in der sich der Kunde
eintragen kann, von vorneherein das Feld Name entsprechend begrenzt sein, um dem
Anwender eine nachträgliche, mühsame Korrektur zu ersparen. Die Information über
die Länge des Feldes „Nachname“ ist also an mindestens drei verschiedenen Stellen
vorhanden. Entsprechend fehlerträchtig kann das Ändern einer Feldlänge sein.
Ähnliche Probleme gibt es beim Ändern eines Feldnamens, von Fremdschlüsselbeziehungen zwischen Tabellen oder von „höherwertigen“ Gültigkeitsprüfungen.Verschärft wird das Problem durch die oben erwähnte Trennung von Lese- und Schreibschnittstelle aus Performanceüberlegungen.
Wir sehen grundsätzlich zwei Möglichkeiten, diesem Problem zu begegnen: Codegenerierung und Aktive Repositories.
Bei beiden Verfahren definiert der Entwickler die entsprechende Information nur an
einer Stelle. Bei der Codegenerierung erzeugt ein Werkzeug die notwendigen statischen Informationen wie Datenbankschema, Quellcode oder HTML-Code. Dieses
Verfahren wird von Enterprise JavaBeans mit der Container Managed Persistence auf
teilweise schon eingesetzt -- dort bleibt das Problem aber grundsätzlich bestehen. Bei
aktiven Repositories steht die Information auch zur Laufzeit an einer zentralen Stelle,
dem Repository zur Verfügung. Dieses Repository kann z.B. die zur Laufzeit zugängliche Schemainformation der Datenbank sein. Inzwischen bieten Datenbankschnittstellen wie JDBC und ODBC hierzu entsprechende Schnittstellen an. Nachteil: Man
ist bezüglich der Art der Information sehr eingeschränkt. Flexibler ist es, die Information in einer eigenen Repository-Komponente, z.B. in eigenen Datenbanktabellen
zu halten. Da die Informationen sich zur Laufzeit nicht oder nur sehr selten ändern,
kann man sie auch hier replizieren bzw. zwischenspeichern, um die Performance
nicht zu gefährden. Ein weiterer Vorteil: Die Schemainformationen werden in weitgehend datenbankneutraler Form definiert und danach auf spezifische Datenbanken
abgebildet.
3.2.3
Interceptors
Die Idee hinter dem Interceptor-Muster ist die transparente Erweiterbarkeit einer
Umgebung. Applikationen sind dabei in der Lage, die Umgebung transparent um
neue Dienste zu ergänzen, ohne den Kern (ORB, Applikationsserver) der Umgebung
und die eigenen Applikationen verändern zu müssen. Die neuen Dienste sind als
separate Interceptors implementiert und werden dem Kern der Umgebung bekanntgemacht (registriert). Diese Dienste interagieren durch festgelegte Schnittstellen
sowohl mit dem Kern als auch mit den Client- oder Serverkomponenten.
30
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Architektur-Überlegungen
Bei komponentenbasierten (COM+, EJB, CORBA Component Model) Applikationsservern müssen Serverkomponenten Services wie Persistenz, Sicherheit, Transaktionen usw. nicht selbst implementieren. Stattdessen brauchen sie nur zu deklarieren
(d.h. entsprechende Attribute setzen), daß sie diese Dienste benötigen, und der Applikationsserver übernimmt den Rest. Wenn eine Komponente beispielsweise die Transaktionsattribute gesetzt hat, fängt (intercept) praktisch die Umgebung alle Nachrichten an die Komponente ab und vergibt ihnen den gewünschten transaktionellen
Charakter.
In diesem Ansatz, der auch als die Interceptor Proxy Variante des Interceptor-Musters
bekannt ist, sind Interceptors Teil des Kerns, nämlich des Applikationsservers. Der
Kern bietet die Interceptor-Services den Applikationen an. Clients sowie Serverkomponenten können keine eigenen Interceptors realisieren, mindestens nicht ohne großen Aufwand. Sie können, wenn gewünscht, die Implementierung der betroffenen
Dienste komplett übernehmen.
Im Gegesatz dazu erweitern die Interceptors bei CORBA (Standardspezifikation) und
(Standard-)COM die Applikationen und nicht den Kern, nämlich den ORB. Sowohl
Clients als auch Server können eigene und separate Interceptors realisieren, die dann
mit dem ORB interagieren.
Abbildung 14:Interceptors
Client
Serverkomponente
Interceptor
Interceptor
Interceptor
Interceptor
Interceptor
Interceptor
ORB
3.2.4
Event Handling
In ereignisgesteuerten Architekturen werden Zustandsänderungen als ausgelöste
Ereignisse wahrgenommen. Dies entkoppelt die Kommunikation zwischen den Komponenten, die Änderungen vornehmen und den Komponenten, die an Änderungen
interessiert sind. Die daduch erreichte Flexibilität hat dazu geführt, daß ereignisgesteuerte Architekturen aktuell häufig zum Einsatz kommen.
Der asynchronen Kommunikation, die früher vorgestellt wurde, liegt oft eine Ereignissverwaltung (Event Handling) zugrunde. Bei ereignisgesteuerten Systemen wird
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
31
Architektur-Überlegungen
der Empfang einer Nachricht als ein Ereignis gesehen, worauf Empfänger entsprechend reagieren.
Die meist bekannten Muster zur Ereignisverwaltung sind: Event Notification
[Rie96], Observer [Gam95] und Publish-Subscribe, das wir nachfolgend beschreiben.
• Publish-Subscribe
In diesem Muster [Kle99] gibt es drei Arten von Komponenten: Die Publishers, die
Subscribers und den Subrscription Manager. Publishers registrieren beim Subscription Manager die Dienste, die sie anbieten. Diese Dienste sind praktisch Daten, die
sich oft ändern und beim Subscription Manager abgelegt werden. Über diese Änderungen der Daten möchten Subscribers informiert werden.
Ein Subscriber meldet bein Subscription Manager sein Interesse an diesen Daten an.
Sobald sich Publisher neue Daten in das Repository legen, werden Ereignisse vom
Manager ausgelöst. Der Manager verschickt anschließend Notifikationen über diese
Ereignisse an alle Interessenten. Folgende Abbildung illustriert eine mögliche Konfiguration für dieses Muster.
Abbildung 15:Das
Publish-Subscribe
Muster
Publisher
......
Publisher
32
Subscriber
Subscription
Manager
......
Subscriber
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Notationsformen für den
Architekturentwurf
4
Notationsformen für den Architekturentwurf
Im vorangegangenen Kapitel wurden einige, im Kontext von Webanwendungen
wichtige Eigenschaften von Komponenten und ihrer Verbindungen identifiziert. Dies
wirft die Frage nach einer entsprechenden Visualisierung auf.
Für den logischen objektorientierten Entwurf hat sich die UML industrieweit durchgesetzt. Für den Entwurf von Software-Architektur, speziell der physikalischen und
Prozeßsicht, werden in der Praxis häufig nichtformale „Box & Line“-Diagramme
verwendet. [Kru95] verwendet Notationen, die nicht vollständig UML-konform sind
und die Darstellung einiger für Webanwendungen wichtiger Aspekte umständlich
machen. Angeregt durch [IBM2001] wollen wir in diesem Kapitel ein UML-Profil
vorstellen, das wichtige Aspekte für Webanwendungen abbildet. Dabei verwenden
wir die von der UML vorgesehenen allgemeinen Erweiterungsmechansimen Contraint, Property und Stereotype und stellen, wo es sinnvoll ist, eine verkürzte grafische Notation vor.
Wir stellen zunächst die Standard-UML-Notation vor und definieren darauf aufbauend Erweiterungen.
4.1
UML Implementierungsdiagramme
[UML99] definiert zwei Arten von Implementierungsdiagrammen: Komponentendiagramme und Deploymentdiagramme.
Komponentendiagramme zeigen die Abhängigkeiten zwischen Softwarekomponenten wie Quellcode-Kompoenten, Objektcode-Komponenten und ausführbaren Komponenten. Eine typische Beziehung ist die Beziehung „verwendet“ (eine sog. Dependency), die durch einen gestrichelten Pfeil von einer Komponente auf eine andere
Komponente oder eines ihrer Interfaces notiert wird:
Abbildung 16:UML
Komponentendiagramm
GUI
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
Update
Planner
33
Notationsformen für den
Architekturentwurf
Dies entspricht einer Abhängigkeit zur Build-Zeit. Die dargestellten Komponenten
sind als Typen zu verstehen. Die Bedeutung des obigen Diagramms ist: Die Komponente GUI verwendet die Schnittstelle Update der Komponente Planner. Man
beachte, dass Methodenaufrufe auch in der Gegenrichtung stattfinden können, wenn
z.B. die Schnittstelle Update einen Abstract Listener enthält.
Deployment-Diagramme zeigen die Konfiguration der Ausführumgebung und der
Softwarekomponenten, der Prozesse und der Objekte, die in ihr ausgeführt werden.
Eine Laufzeitkomponente, die auf einem ausführenden Knoten installiert wurde, wird
innerhalb des als Quader symbolisierten Knotens dargestellt:
Abbildung 17:UML
Deployment-Diagramm
Die dargestellten Komponenten sind dabei als laufende Instanzen zu verstehen. Auch
hier stellt ein gestrichelter Pfeil eine Verwendungsbeziehung dar, allerdings eben im
Sinne von „Die auf Joe’s Machine laufende Instanz der Komponente Planner verwendet die auf dem AdminServer laufende Instanz von Scheduler über die Schnittstelle reservations.“
Die UML erfüllt damit das von [Kru95] vorgegebene Programm zu drei Vierteln. Statische Klassendiagramme in Verbindung mit Packages eignen sich für die logische
Sicht. Statische Klassendiagramme und Komponentendiagramme zeigen die Entwicklungssicht. Die letztgenannten Deployment-Diagramme zeigen die physikalische Sicht. Lediglich die Prozeßsicht findet keine wirkliche Entsprechung.
Prozesse werden in [Kru95] als Einheiten dargestellt, die auf einem ausführenden
Knoten laufen, denen Systemressourcen wie Adressraum und Prozessorzeit zugeordnet werden und die Nachrichten und Ereignisse an andere Prozesse verschicken. Bei
den von uns anvisierten Anwendungen spielen die Laufzeitkomponenten genau diese
Rolle. Insofern wird auch die Prozeßsicht durch Deployment-Diagramme abgedeckt.
34
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Notationsformen für den
Architekturentwurf
4.2
Modellierung von Web-Architekturen
Für die Modellierung von Web-Architekturen bieten diese Elemente eine gute Grundlage, sind aber noch nicht ausreichend. So schlägt [IBM2001] eine Notation vor, in
der explizit zwischen Schreib-Lese-Daten, Nur-Lese-Daten und Cache-Daten unterschieden wird:
Abbildung 18:Komponenten von WebArchitekturen.
Quelle: [IBM ..]
Schreib-Lese-Daten werden als blauer Zylinder, Nur-Lese-Daten als gelber Zylinder
und Cachedaten, Zwischenergebnisse oder replizierte Daten als grüner Zylinder dargestellt (siehe auch Abschnitt Replikation).
Eine weitere Unterscheidung betrifft den Spielraum der Entwicklung: Anwendungen
(lies: grobkörnige Komponenten), die im Zuge des Projekts neu oder weiterzuentwikkeln sind werden von Anwendungen der Partner, zu denen lediglich die Schnittstelle
bekannt ist, und Legacy-Anwendungen unterschieden.
Auf das UML-Modell übertragen, sind sowohl die Daten als auch die Anwendungen
in dieser Notation als Komponenten zu betrachten. Bei beiden existieren sowohl ein
Typaspekt als auch ein Instanzaspekt.
4.2.1
Datencluster
Daten sind dabei als „datenlastige Komponenten“ zu verstehen, mit ggf. mehreren
Schnittstellen, von denen manche nur Lesezugriffe zulassen können. Den Daten oder
der Komponente an sich kann man die Eigenschaft „Nur-Lesen“ schlecht zuordnen.
Alle Daten, die in der Anwendung existieren, müssen irgendwann irgendwie dorthin
gelangen, also geschrieben werden. Da die Komponente diese Daten kapseln sollte,
muss sie dafür eine Schnittstelle anbieten. Diese muss aber nicht für den Webzugriff
zur Verfügung stehen. Andererseits kann man auch einer isolierten Schnittstelle
schlecht formal die Eigenschaft „Nur-Lesen“ zuordnen, auch wenn dies fachliche
sinnvoll erscheint. Den Implementierer einer Schnittstelle hindert ja nichts daran,
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
35
Notationsformen für den
Architekturentwurf
eine globale Statistik der „fachlichen Lesezugriffe“ zu führen, und damit führen dann
Aufrufe der Schnittstelle zu Zustandsänderungen in der Komponente. Die „NurLese“-Eigenschaft ist also sinnvollerweise eine Eigenschaft der Beziehung zwischen
Schnittstellenimplementierung, d.h. der Beziehung zwischen Schnittstelle und Komponente.
Eine datenlastige Komponente wird üblicherweise durch eine Menge von relationalen Tabellen und Beziehungen realisiert. Wir schlagen für eine solche Komponente
den Stereotypen data cluster vor.
Die Zugriffsart der Schnittstelle sollte durch Verwendung der Eigenschaft StateAccess gekennzeichnet werden. Als alternative Notation schlagen wir offene Pfeile vor:
Abbildung 19:Datencluster - UML Standardnotation
{HasEnterpriseState = true}
{StateAccess = readonly}
Lesen
{StateAccess = readonly}
Ändern
{StateAccess = readwrite}
Suchen
{StateAccess = readwrite}
Flüge
<<data cluster>>
Buchen
Flugdaten
Hinzufügen {StateAccess = readwrite}
Abbildung 20:Datencluster - Verkürzte
Notation
Lesen
Suchen
Flüge
Buchen
4.2.2
Ändern
Hinzufügen
<<data cluster>>
Flugdaten
SE
Sichtbarkeit von Daten
Aus den obigen Überlegungen ergibt sich, daß es sinnvoll ist, die Daten hinsichtlich
ihrer Gültigkeit bzw. Sichtbarkeit (Scope) zu unterscheiden. Bei typischen Webanwendungen sind diese Sichtbarkeitsbereiche die Session, der Benutzer (Kunde) und
das gesamte Unternehmen. Dies kann im UML-Modell durch die Eigenschaften
HasEnterpriseState, HasUserState und HasSessionState ausgedrückt werden. Es
werden drei Eigenschaften benötigt, da eine Komponente gleichzeitig session-,
benutzer und unternehmensbezogene Daten verwalten kann. In der verkürzten Notation verwenden wir in der unteren rechten Ecke platzierte SE, SU und SS. Die Unterscheidung zwischen Benutzer- und Unternehmensbereich ist nicht immer leicht zu
treffen und daher optional.
36
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Notationsformen für den
Architekturentwurf
4.2.3
Datenbankschnittstellen
Ein Datencluster wird im Normalfall über generische (d.h. nicht fachliche) relationale Schnittstellen wie ODBC oder JDBC angesprochen. Nur in manchen Fällen werden fachliche Schnittstellen mittels Stored-Procedure-Mechanismen realisiert. Es ist
daher sinnvoll, die Standardschnittstellen durch vereinfachte Pfeile wie in der folgenden Abbildung darzustellen.
Der Stereotyp data cluster wird zusätzlich durch den altbekannten, in [IBM..] verwendeten Zylinder visualisiert.
Abbildung 21:Datencluster mit Standardschnittstelle
Suchen
Flugdaten
Flüge
Buchen
SE
Wenn das Deployment, z.B. im Komponentendiagramm, nicht im Vordergrund steht,
ist es u.U. sinnvoll, funktionale Komponente und Datencluster zu einer Komponente
zusammenzufassen:
Abbildung 22:Komponente mit persistentem Zustand
Suchen
Flüge
Buchen
SE
4.2.4
Weitere Eigenschaften von Schnittstellen
Wie schon erläutert, haben Komponenten mit verbindungslosen Schnittstellen ein
wesentlich besseres Skalierungsverhalten als verbindungsbehaftete. Wie gezeigt,
kann dies mittels der Eigenschaft HasSessionState unterschieden werden, ob eine
Komponente Session State hält oder nicht. Die Eigenschaft HasSessionState läßt sich
aber auch der Schnittstelle zuordnen, z.B. weil man über die anderen Schnittstellen,
die die Komponente implementiert, nichts weiß. In einem solchen Fall notieren wir
verbindungslose Schnittstellen mit einer Null, verbindungsbehaftete Schnittstellen
mit einem S:
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
37
Notationsformen für den
Architekturentwurf
Abbildung 23:SessionState-Eigenschaft
von Schnittstellen
SQL Insert
0
Resultset Cursor
s
<<data cluster>>
Flugdaten
SE
In dem dargestellten Beispiel handelt es sich um einen Datencluster, auf den mit Hilfe
von zwei Schnittstellen zugegriffen werden kann - auch wenn man diese Einteilung
in einer praktischen Anwendung vielleicht nicht treffen würde. Über die Schnittstelle
SQL Insert können Datensätze hinzugefügt werden. Da z.B. bei jedem Aufruf ein
kompletter Datensatz übergeben wird, ist diese Schnittstelle verbindungslos. Bei
Resultset Cursor handelt es sich dagegen um den bekannten Cursor-Mechanismus für
das Lesen von Datensätzen mit solchen Methoden wie GetResultset (z.B. über SQL
Select), NextRecord und PreviousRecord. In diesem Fall muß sich die Komponente
für jede Verbindung die aktuelle Ergebnismenge und die aktuelle Cursorposition
merken.
Eine weitere wichtige Eigenschaft von Schnittstellen ist die Art, in der Aufrufe erfolgen. Wie im letzten Kapitel gezeigt, haben asynchrone Schnittstellen z.T. Vorteile
gegenüber synchronen Schnittstellen. Außerdem sind unidirektionale von bidirektionalen Schnittstellen zu unterscheiden. Bei bidirektionale Schnittstellen können Aufrufe auch in der Gegenrichtung erfolgen, das heißt die Komponente ruft ihren Client
auf - z.B. über einen Abstract Listener. Wir verwenden die in der UML schon für
Nachrichten definierte Eigenschaft asynchronous, und die neue Eigenschaft bidirectional. Die Notation lehnt sich an die in der UML verwendete Notation für Nachrichten an:
Abbildung 24:Art der
Schnittstellenaufrufe
Unidirektional, synchron
Bidirektional, synchron
Unidirektional, asynchron
Bidirektional, asynchron
Wir arbeiten an Notationen für Lastverteilung und Caching. Außerdem verfolgen wir
die Vision, durch eine recht formale Modellierung von Architektureigenschaften Probleme automatisch zu erkennen.
38
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Referenzarchitekturen
5
Referenzarchitekturen
Im folgenden stellen wir einige Referenzarchitekturen vor, die für eine oder mehrere
Kategorien von Webanwendungen eine gute Kombination der vorgestellten Muster
darstellen.
Zur Auswahl einer passenden Architektur sind die vier im ersten Teil vorgestelltenHauptkriterien entscheidend.
Anwendungen mit statischem Inhalt sollte man mit Content-Management-Architekturen realisieren. Eine Spielart für Inhalte, die in verschiedenen Formaten dargestellt
werden müssen, sind XML-Pipe-Architekturen.
Anwendungen ohne Sitzungszustand lassen sich gut in 2-Schichten-Architekturen
realisieren. Auch einfachere Applikationen mit Sitzungszustand lassen sich darin realisieren, wenn sich die Nutzerlast in Grenzen hält. Benutzerinformationen bestimmen
dabei mit das Skalierungsverhalten.
Komplexere Anwendungen erfordern in jedem Fall eine Trennung von Präsenationslogik und Fachlogik. Hohe Lasten bei Anwendungen mit Sitzungszustand erfordern
eine leistungsfähige Infrastruktur. Noch viel stärker gilt dies für Anwendungen mit
komplexen Transaktionen. Die vorgestellte Enterprise-Architektur erfüllt alle diese
Anforderungen.
5.1
2-Tier
Der Begriff der zweischichtigen Architektur stammt aus der Zeit, als Clients direkt
mit Datenbankserver kommuniziert haben. Clients waren schwergewichtig, weil sie
die gesamte Logik für die Kommunikation mit dem Server implementiert haben. Im
Hinblick auf die heutigen Webanwendungen haben 2-Tier-Architekturen eine andere
Form eingenommen, die in Abbildung 25 dargestellt wird.
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
39
Referenzarchitekturen
Abbildung 25:2-TierArchitektur
Client
Server Tier
ServerLogik
Dynamische
HTML-Seiten
Statische
HTML-Seiten
Datenbank
Services
Die Abbildung 25 illustriert eine Referenzarchitektur mit optionalen Teilen und Verbindungen. Von dieser Referenz können verschiedene konkrete Architekturen abgeleitet werden.
Die einfachste Arhitektur die von der Abbildung 25 abzuleiten ist, ist die Architektur
eines Web-Client, der vom Webserver lediglich statische HTML-Seiten erfordert.
Das heißt, in Abbildung 25 fallen die Komponenten “dynamische HTML-Seiten”,
“Datenbank” und “Serverlogik” sowie die entsprechenden Verbindungen weg.
Statische Seiten enthalten feste Inhalte. Dazu kann Logik in der Form von Skripten,
Applets oder Steuerelemente gehören, die auf der Client-Seite ausgeführt werden.
Die letztere Möglichkeit errinert an die erwähnten schwergewichtigen Clients.
Dieses Szenario wird erweitert, wenn die statischen Seiten serverseitige Applikationslogik (z.B. CGI-Applikationen, Servlets und anderes) oder eine Datenbank
ansprechen. Die Datenbank kann mit dem Webserver integriert sein (z.B. Zope) oder
sie kann auf einem separaten Server laufen.
Das 2-Tier-Szenario läßt sich mit dynamischen HTML-Seiten weiter ausbauen. In
diesem Fall sind alle Komponenten in Abbildung 25 präsent. Dabei erzeugen Serverlogik oder Anweisungen innerhalb des HTML-Quellcodes die dynamischen Inhalte.
Möglich ist auch, daß die Anweisungen oder die separate Serverlogik auf Datenbanken zugreifen. Der Webserver kann abschließend auch Services wie Sicherheit oder
Pooling anbieten.
40
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Referenzarchitekturen
Der Hauptvorteil von 2-Tier-Architekturen liegt an der kostengünstigen Implementierung. Apache ist die populärste Open-Source-Lösung in dieser Hinsicht [Ser-A].
Es wird geschätzt, daß der Apache-Server für mindestens 58% aller Web-Domänen
eingesetzt wird. Es muß allerdings erwähnt werden, daß der Apache-Server sehr oft
bei 3-Tier-Architekturen zum Einsatz kommt. Umgebungen, die den zweischichtigen
Ansatz unterstützen sind auch unter dem Begriff “Server Side Scripting Tools”
bekannt.
Der zweischichtige Ansatz führt jedoch schnell zu Engpässen, wenn anspruchsvolle
Szenarien wie personalisierte Dienste, verteilte Transaktionen, Integration von
Legacy-Applikationen oder Enterprise Information Systems [Sun-A] gewünscht sind.
5.2
Enterprise (N-Tier)
Der Hauptunterschied zwischen 2-Tier- und Enteprise-Architekturen liegt an der
Komponentenorientierung, die der Enterprise-Ansatz weitgehend unterstützt. Dies
fördert die Modularität sowie die Wiederverwendung und darüber hinaus die Flexibilität und Skalierbarkeit anspruchsvoller Webapplikationen.
Zudem unterstützten Enterprise-Architekturen die Verteilung von Komponenten oder
Systemen. Deswegen sind sie auch als mehrschichtige oder N-Tier-Architekturen
bekannt.
Zusammenfassend sind Enteprise-Architekturen für geschäftskritische Webapplikationen gedacht, die folgende Eigenschaften besitzen [BEA-E]:
• Sicherheit: Applikationen müssen bis zu Tausenden von Nutzern skalieren können
und trotzdem sicher sein
• Zuverlässigkeit: Applikationen müssen trotz Client-, Prozeß-, Server- und Netzwerkausfälle zur Verfügung stehen.
• Interoperabilität: Applikationen müssen mit Legacy-Systemen interoperieren.
• Management: Die Verwaltung von Client/Server-Applikationen, die über zahlreiche Maschinen weltweit laufen, muß möglich sein.
5.2.1
Infrastruktur-Komponenten
Abbildung 26 stellt die Enteprise-Architektur dar (vgl. [Sta96], [Cut01], [Mei01],
[Fit01]). Die Webserver-Komponente ist auch hier präsent und kann dieselbe Funktionalität wie bei der 2-Tier-Architektur anbieten. Bei der Enteprise-Architektur ist
auch eine Schnittstelle zwischen dem Webserver und dem Application Server implementiert.
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
41
Referenzarchitekturen
Abbildung 26:Layers
einer EnterpriseAchitektur
Web Client
HTTP
Web Server
Firewall
Application Server
Data Services
Backend
Collaboration
Legacy
Applications
Enterprise Components
EAI
Workflow
Personalization
Common Services
Connectors
Enteprise
Information
Systems
XML
Databases
B2B Partners
Nachfolgend beschreiben wir die im Vergleich zu Abbildung 25 zusätzlichen Komponenten der Enteprise-Architektur:
• Firewall
Die Firewall schirmt das interne Netz gegen das Internet ab.
• Application Server
Die Logik-Komponenten der 2-Tier-Architektur (z.B. ein Servlet) kommuniziert mit
dem Application Server, um Funktionalitäten der Enterprise-Komponenten zu nutzen. Der Application Server enthält also Informationen über alle verfügbaren Komponenten und ist für ihre Lokalisierung, Instanziierung, Zwischenspeicherung und
Unterstützung durch Services zuständig.
42
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Referenzarchitekturen
• Common Services
Unter Common Services sind Dienste wie Sicherheit, Transaktionen und Konkurrenzfähigkeit gemeint. Diese Services werden vom Application Server implementiert. Dadurch brauchen Enteprise-Komponenten sich nicht um derartige Services zu
kümmern. Der Application Server erweitert, wenn gewünscht, jede Enteprise-Komponente transparent um Funktionalität der Common Services.
• Connectors
Konnektoren implementieren EAI-Schnittstellen (Enteprise Application Integration)
für die Integration externer Backend-Applikationen.
• Workflow (Engine)
Entwickler modellieren Geschäftsvorgänge als Workflows und verbinden sie mit
Funktionalität der Enterprise-Komponenten. Die Workflow Engine erlaubt die Ausführung von Workflows zur Laufzeit.
• Personalization
Die Personalization-Komponente nimmt eine Anpassung der HTML-Seiten an
bestimmte Clients vor. Die Art der Anpassung wird durch Regeln definiert. Eine Rule
Engine sorgt für die Haltung der Regeln zur Laufzeit.. Zudem wird es den Clients
möglich, sich zu registrieren und über Notifikationen informiert zu werden.
• Enterprise Components
Die Enterprise-Komponenten implementieren die Geschäftslogik in der Form von
Funktionen, die den Clients letztendlich zur Verfügung stehen.
• Data Services
Es handelt sich um Dienste wie Data Warehouses, Medaten-Repository und ähnliches. Die Ziele dieser Dienste sind vor allem die Integration, Vereinheitlichung und
Analyse verschiedener Datenquellen. Content Management Funktionalität kann auch
angeboten werden. Die Content Management Architektur behandeln wir separat im
Abschnitt 5.4.
• Collaboration
Collaboration kommt in Business to Business Szenarien zum Einsatz. Es werden
XML- (z.B. XML-Parser, -Übersetzer) sowie Registrierungs-Services angeboten. Mit
den letzteren können sich Partner anmelden und Rollen (z.B. Lieferant) in einem
B2B-Szenario einnehmen. Die Collaboration-Komponente sorgt zur Laufzeit für das
Senden und Empfangen von Geschäftsnachrichten für registrierte Partner. Diese
Komponente kann die Workflow-Komponente beinhalten, um Geschäftsvorgänge die
sich über verschiedene Geschäftspartner ausstrecken, zu unterstützen.
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
43
Referenzarchitekturen
• Enteprise Information Systems
Sun fasst unter dem Begriff Enterprise Information Systems große kommerzielle
Systeme zusammen wie: PeopleSoft. SAP R/3, IBM’s CICS, RPG sowie nicht-relationale Datenbanken.
5.2.2
Realisierung einer 4-Schichten-Architektur
Eine Aufteilung der Anwendungskomponenten in vier Schichten, wie in Abbildung
27 gezeigt, führt zu hoher Skalierbarkeit in dieser Umgebung und bietet einige Flexibilität und damit Zukunftssicherheit. Die Bennenung der Schichten und grundlegende
Konzepte wurden [HeS00] entnommen.
Abbildung 27:VierSchichten-Architektur
HTTP
HTTP
HTTP
Presentation
s
Workspace
1
0
0
Enterprise
0
2
Resource
(Schema)
Hervorstechendstes Merkmal ist dabei die Trennung von Enterprise und WorkspaceSchicht. Diese Trennung sorgt dafür, dass die „schweren“, transaktionsgesicherten
Operationen von Komponenten gemäß Abschnitt 3.1.7 mit verbindungslosen, grobgranularen Schnittstellen ausgeführt werden, die somit von der Verwaltung der u.U.
vielen tausend Verbindungen entlastet sind (Enterprise Tier). Wo die Verwaltung von
Session State über mehrere zusammenhängende Requests notwendig ist, führt man
eine entsprechende Komponente auf der Workspace Tier ein. In jedem Fall ist die
Präsentationslogik gemäß Abschnitt 3.2.1von der fachlichen Logik getrennt.
44
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Referenzarchitekturen
Mit dieser Trennung läßt sich eine effiziente Lastverteilung sowohl „von Hand“ als
auch durch die von vielen Applikationsservern mitgelieferten, und damit „unsichtbaren“ Lastverteilungsmechanismen erreichen.
Die Schnittstellen der Enterprise-Komponenten sind zu den oberen Schichten hin
synchrone Schnittstellen, da letztendlich das synchrone HTTP-Protokoll bedient werden muss. Zwischen den Enterprise-Komponenten können synchrone oder asynchrone Schnittstellen zum Einsatz kommen, wobei asynchrone Schnittstellen insbesondere zwischen großen Subsystemen in Abschnitt 3.1.6 erwähnten Vorteile (z.B.
größerer Durchsatz und Verläßlichkeit) haben. Zur logischen Entkopplung können
die in Abschnitt 3.2.4 erwähnten Publish-Subscribe-Mechanismen eingesetzt werden.
Synchrone Schnittstellen können auch zwischen den Enterprise-Komponenten notwendig sein, wenn es sich um „Ereignisse mit Vetorecht“ handelt.
Dazu ein Beispiel aus einem ERP-System: Ein ERP-System enthält unter anderem
eine Buchhaltungskomponente und eine Komponente für die Materialwirtschaft. Die
Buchhaltungskomponente könnte vor dem Löschen einer Kostenstelle ein entsprechendes Ereignis aussenden. Wenn die KOstenstelle, beispielsweise in der Materialwirtschaft, schon bebucht wurde, würde die Materialwirtschaftskomponente entsprechend ein Veto gegen das Löschen der Kostenstelle einlegen.
In beiden Fällen bieten sich XML-Schnittstellen an, da bei den grobgranularen
Methoden häufig komplexe Daten übergeben werden müssen und sich die Schnittstellenevolution so leichter bewältigen läßt. Logs und Auswertungen werden durch
das Textformat auch erleichert.
Mit den Schnittstellen der Enterprise-Schicht steht die ideale Plattform für B2B-Integrationsprojekte bereit. Die Schnittstellen lassen sich z.B. als SOAP-basierter Webservice veröffentlichen und in die Wertschöpfungskette anderer Unternehmen integrieren. Mehr dokumentenorientierte Standards wie Biztalk oder ebXML
entsprechen den erwähnten asynchronen XML-Schnittstellen der Systeme.
Auch der für manche Anwendungsgebiete immer noch sinnvolle Rich Client für den
Backoffice-Bereich läßt sich über die Enterprise-Schicht anbinden.
Durch die Trennung Workspace / Presentation können Mehrsprachigkeit und die
Anbindung z.B. von WAP-Clients realisiert werden.
Für die Durchsetzung einer solchen Architektur im Entwicklungsprozeß bieten sich
bei größeren Projekten automatisierte Verfahren an, wie z.B. in [Ciu99] beschrieben.
Für die Realisierung dieser 4-Schichten-Architektur bieten sich vor allem die im
App2Web-Dokument Richtlinien vorgestellten Umgebungen J2EE und .NET an.
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
45
Referenzarchitekturen
Zu den einzusetzenden Infrastruktur-Elementen gibt die folgende Tabelle einige Hinweise:
5.3
Implementierung in Schicht
Java 2 Enterprise Edition
Microsoft .NET
Presentation
Java Server Pages und Servlets
ASP.NET-Seiten mit entsprechenden CodeBehind-Klassen
Workspace
Servlets mit Verwendung von Sessions, einfache Java-Objekte, EJB:
Session Beans
Keine besondere Unterstützung:
Einfache Klassen
Enterprise
Zur Implementierung von synchronen Schnittstellen: Statefree Session
Beans
Zur Implementierung von asynchronen Schnittstellen: Message driven
Beans
Zur Implementierung des Datenzugriffs: Entity Beans
Zur Implementierung von
Schnittstellen bieten sich Webservice-Klassen an. Jede Komponente auf Enterprise-Ebene kann
in einen Webservice gekapselt
werden.
Für den Datenzugriff erlaubt
ADO.NET einen hohen Komfort.
XML-Pipe
Die XML-Pipe Architektur unterstützt das Senden und Empfangen von Nachrichten
im XML-Format. Wie bereits erwähnt, kommt diese Architektur in Business To Business Szenarien sehr oft zum Einsatz, weil die XML-Nachrichten zwischen Partnern
mit heterogenen Systemen gut austauschbar sind.
XML-Nachrichten können strukturierte Daten, Anforderungen oder auch binäre
Daten als Attachments enthalten. Abbildung 28 stellt die XML-Pipe Architektur dar
(vgl. [Mic-F], [BEA-F]).
46
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Referenzarchitekturen
Abbildung 28:XMLPipe Architektur
Empfänger
XML Server
Sender
XML
XML
Reader
XML
Parser
XML
Serializer
Dispatcher
Listener
• Listener
Der Listener empfängt und erkennt die XML-Nachricht. Anschließend initialisiert er
den XML-Server und leitet die Nachricht an ihn weiter.
• XML Reader
Um die XML-Nachricht bearbeiten zu können, muß der XML-Server sie in eine für
ihn geeignete Form übersetzen (z.B. DOM-Baum). Die Reader-Komponente liest die
Nachricht und führt diese Übersetzung durch.
• XML Parser
Nachdem die XML-Nachricht für den Server “verständlich” gemacht wurde, muß der
Server die Nachricht analysieren, um von der XML-Struktur die Information herauszubekommen. Dafür ist der Parser verantwortlich
• Dispatcher
Der Dispatcher sorgt praktisch für die Interpretation der Ergebnisse aus der Analyse
der Nachricht. Möglicherweise wird eine Geschäftsfuktionalität basierend auf diesen
Ergebnissen angestoßen.
• Serializer
Wenn eine Antwort gewünscht ist, muß sie auch in XML formatiert werden. Der
Serializer ist dafür zuständig.
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
47
Referenzarchitekturen
5.4
Content Management
Content Management Systeme vereinheitlichen Daten aus verschiedenen Quellen
und unterstützen vor allem die Datensuche und -publikation. Dies erfolgt durch die
Nutzung von Metainformationen, die auf die Semantik der Daten hinweisen.
Abbildung 29 illustriert eine Content Management Referenzarchitektur (vgl. [Vig-A],
[Con-A], [Dig-A]), die aus zwei Hauptkomponenten besteht: aus dem Content Delivery System, das die Daten für den Web Client aufbereitet und liefert, und dem Content Management Server, der für die Datenspeicherung, -zugriff sowie -integration
zuständig ist.
• Content Delivery Server
Der Content Delivery Server ist der Kern des Content Delivery Systems. Er realisiert
den Zugriff auf den Content Management Server und bereitet Daten auf. Externe
Webserver können mit Hilfe von Plugins an den Content Delivery Server angeschlossen werden. Der Content Delivery Server ist auch für die Autorisierung der Benutzer
zuständig.
• Publisher
Der Publisher erledigt schwergewichtige Aufgaben wie die Neuanlage eines Dokumentes. Er startet Transaktionen in der Content-Datenbank und kann auf statische
Dateien zugreifen.
• Dispatch Service
Es handelt sich um einen Broker, der die Kommunikation mit der Content-Datenbank
realisiert. Der Dispatcher führt leichtgewichtige Operationen wie das Löschen eines
Dokumentes oder die Neueanlage eines Benutzers aus.
• Content Database
Die Content-Datenbank bietet eine einheitliche, strukturierte (möglicherweise objektorientierte) Sicht auf eigene und integrierte Daten und Metainformationen. Enthalten
sind auch die Informationen über Benutzer, Benutzergruppen und die zugewiesenen
Rechte. Transaktionen werden für jedes Objekt der Datenbank unterstützt.
48
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Referenzarchitekturen
Abbildung 29:Content Management
Architektur
Web
Client
Content Delivery System
Webserver
Content
Delivery
Server
Content Management Server
Publisher
Static
Static
Files
Static
Files
Files
Dispatch
Service
Partners
Content
Database
Syndication
Service
External
Databases
Aggregation
Service
• Aggregation Service
Der Aggregation Service, in seiner einfachsten Form, enthält Adapter für die Integration externer Datenbanken. Eine erweiterte Variante stellt Crawlers [Fit01] oder
Agenten zur Verfügung, die externe Systeme besuchen und nach relevanten Daten
suchen.
• Syndication Service
Der Syndication Server unterstützt die Verteilung der Daten an Geschäftspartner. Der
Service unterstützt unterschiedliche Daten, die verpackt und an registrierte Partner
übersendet werden. Dabei sind verschiedene Übergabemöglichkeiten erlaubt (z.B.
ereignisgesteuert, im voraus geplant usw.). Die Verwaltung und Zurückverfolgung
verteilter Daten wird ebenso unterstützt. Agenten sind auch hier möglich und helfen
bei der Integration der gelieferten Daten.
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
49
Literatur
6
50
Literatur
[BEA-A]
Enterprise Middleware Series, Reliable Queuing Using BEA Tuxedo,
BEA Systems 2001, http://www.bea.com/products/tuxedo
paper_queuing.shtml
[BEA-B]
Online Dokumentation zu BEA Tuxedo Release 7.1, BEA Systems
2001, http://e-docs.bea.com/tuxedo/tux71/index.htm
[BEA-C]
WebLogic Server Programming, BEA WebLogic JSP, BEA WebLogic
Server 6.1 Beta, BEA Systems, June, 2001, http://e-docs.bea.com/
wls/docs61///////pdf/jsp.pdf
[BEA-D]
WebLogic Server Using WebLogic BEA Server Clusters, BEA
WebLogic Server 6.0, BEA Systems, March 2001, http://edocs.bea.com/wls/docs61///////pdf/cluster.pdf
[BEA-E]
BEA WebLogic Enterprise Introduction, BEA WebLogic Enterprise
4.1, BEA Systems Mai 2001, http://www.bea.com/products/weblogic/
enterprise/enterprise_intro.pdf
[BEA-F]
Überblick über BEA WebLogic Collaborate, BEA Systems 2001,
http://e-docs.bea.com/wlcollab/v1_0/getstart/over.htm
[Bec94]
Kent Beck, Patterns Generate Architectures, Proceedings of the European Conference on Object-Oriented Programming, 1994, Bologna,
Italien
[Con-A]
Contentmanager.de, Marktübersicht: Produktindex, http://www.contentmanager.de/itguide/markt_produktidx.php
[Cut01]
Component Development Strategies, The Monthly Newsletter from
Cutter Information Corp. on Managing and Developing ComponentBased Systems, VOL. X, Special Excerpt, Cutter Information Corp.
ISSN 1552-7391, 2001
[Dig-A]
Zope Content Manager’s Guide, Digital Creations, 2000, http://
www.zope.org/Documentation
[Fel98]
Pascal FELBER, The CORBA Object Group Service, Doktorarbeit,
École Polytechnique Fédérale de Lausanne, 1998, http://
lsewww.epfl.ch/OGS/thesis/
[Fit01]
Patrick Fitzgerald, Tie it together and open it up with Enterprise Information Portals, Trendmarkers e-newslettter, Techmetrix Research,
April 2001, vefügbar unter http://www.techmetrix.com/trendmarkers/
tmk0401/tmk0401-3.php3
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Literatur
[Gam95]
E. Gamma et al., Design Patterns - Elements of Reusable Object-Oriented Software, Addison-Wesley, 1995
[Gom01]
Hassan Gomaa et al., Reusable Component Interconnection Patterns
for Distributed Software Architectures, Proceedings of the Symposium on Software Reusability, 2001, Toronto
[Hal97]
Daniel S. Halbach, Eric C. Newton: A Practical Alternative to Business Objects. An Experience Report. http://www.pareto.com/
exprep97.html.
[Has01]
Willi Hasselbring: Reference Architecture Modeling with the UML
and Vital: A Comparative Study, Proceedings of 1st ICSE Workshop
on Describing Software Architecture with UML, http://www.rational.com/events/ICSE2001/index.jsp
[HeS00]
Peter Herzum, Oliver Sims: Business Component Factory. OMG
Press, 2000.
[Hun98]
Kitty Hung, Tony Simons, Tony Rose: „The Truth Is Out There?“: A
Survey of Business Objects. 5th International Conference on ObjectOriented Information systems (OOIS'98), 9-11 September 1998, Paris
[IBM-A]
IBM Patterns for E-Business, http://www-106.ibm.com/developerworks/patterns/b2bi/select-application-topology.html
[JoA01]
Isabel John, Christoph Andriessens: Domänenmodellierung für Webanwendungen. Bericht aus dem Projekt Application2Web, FZI 2001
[Kle99]
Mark Klein Rick Kazman, Attribute-Based Architectural Styles, Software Engineering Institute Carnegie Mellon University Pittsburgh, PA
15213 REPORT NUMBER CMU/SEI-99-TR-022
[Kru95]
Philippe Kruchten: The 4+1 View Model of Architecture. IEEE Software, November 1995. http://www.rational.com/products/whitepapers/350.jsp
[Mei01]
Jürg Meier, Tanja Scharf, Regeln für die Anwendungsarchitektur verteilter Systeme, Objektspektrum März/April 2001, pp 77-81
[MeA00]
Menascé, Almeida: Scaling for E-Business. Technologies, Models,
Performance and Capacity Planning, Prentice Hall 2000.
[Mic-A]
Online Dokumentation zu Microsoft Queuing Services, Microsoft
Corporation 2001, http://msdn.microsoft.com/library/psdk/msmq/
msmq_overview_4ilh.htm
[Mic-B]
Microsoft Message Queuing Services, A Guide to Reviewing Microsoft Message Queue Server, Release 1.0-The Message Queuing Service of Windows NT, 1997, Microsoft Corporation 2001
[Mic-C]
The ODBC Programmer’s Reference, Microsoft Development Network, 2001, Microsoft Corporation 2001, http://msdn.microsoft.com/
library/default.asp?URL=/library/psdk/iisref/eadg6cbl.htm
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
51
Literatur
52
[Mic-D]
Active Server Pages Guide, Microsoft Development Network, Microsoft Corporation 2001, http://msdn.microsoft.com/library/
default.asp?URL=/library/psdk/iisref/eadg6cbl.htm
[Mic-E]
Gregory Leake, Architecture Decisions for Dynamic Web Applications: Performance, Scalability, and Reliability, November 2000, Microsoft Corporation 2001, http://msdn.microsoft.com/library/techart/
docu2kbench.htm
[Mic-F]
Soap Toolkit 2.0 Gold Release, Microsoft Development Network,
2001, http://msdn.microsoft.com/library/default.asp?url=/library/enus/dnsoap/html/soap1and2.asp
[Mic-G]
Reference Architecture for Commerce: Business to Consumer
(B2C),Microsoft Corporation 2001, http://msdn.microsoft.com/
library/default.asp?url=/library/en-us/dnrac/html/
mracv1_overview.asp
[Raj99]
Gopalan Suresh Raj, A detailed comparison of EJB and the MTS
Models, http://members.tripod.com/gsraj/misc/ejbmts/ejbmtscomp.html
[Rie96]
D. Riehle: The Event Notification Pattern - Integrating Implicit Invocation with Object-Orientation, Theory and Practice of Object
Systems vol. 2 no. 1, pp. 43-52, John Wiley & Sons, 1996
[Sch98]
Douglas C. Schmidt, Steve Vinoski, Object Interconnections, An
Introduction to CORBA Messaging, SIGS C++ Report magazine,
Dezember 1998, (http://www.iona.com/hyplan/vinoski/col15.pdf)
[Ser-A]
ServerWatch Web Servers, http://serverwatch.internet.com/webserverapache.html
[Sta96]
Enterprise Architecture Project, Final Report Juni, 1996, Stanford
University Information Technology Systems & Services, Architecture
Planning & Standards Redwood Hall, Ext 32696
[Sun-A]
J2EE Connector Architecture brings business systems to the Web,
http://java.sun.com/features/2000/08/connect.html
[Sun-B]
Sun Microsystems: Java 2 Platform Enterprise Edition Blueprints.
http://java.sun.com/j2ee/blueprints/
[Sun-C]
J2EE Blueprints, J2EE Design Patterns, Model-View-Controller
Architecture, http://java.sun.com/j2ee/blueprints/design_patterns/
model_view_controller/index.html
[Sun-D]
Sun Microsystems: J2EE Patterns Catalog. http://developer.java.sun.com/developer/restricted/patterns/
J2EEPatternsAtAGlance.html
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Literatur
[Sut97]
Jeff Sutherland: The Object Technology Architecture: Business
Objects for Corporate Information Systems. In: Sutherland et al.:
Business Object Design and Implementation. Springer, 1997. http://
www.jeffsutherland.org/papers/boa_pap.html
[UML99]
OMG Unified Modeling Language Specification, June 1999. http://
www.rational.com/uml
[Vig-A]
Vignette Content Management Server, Vignette Corporation, 2001,
http://www.vignette.com
Copyright  Fraunhofer IESE / FZI Karlsruhe2001
53
Literatur
54
Copyright  Fraunhofer IESE / FZI Karlsruhe 2001
Herunterladen