Robuste und flexible Kommunikation in verteilten Anwendungen Ralf Westphal MSDN Regional Director, freier Autor & Berater [email protected].
Download ReportTranscript Robuste und flexible Kommunikation in verteilten Anwendungen Ralf Westphal MSDN Regional Director, freier Autor & Berater [email protected].
Robuste und flexible Kommunikation in verteilten Anwendungen Ralf Westphal MSDN Regional Director, freier Autor & Berater [email protected] Kennen Sie das... Software P Software Q Crash! Komponente K2 K1 Typische Szenarien Zwei Anwendungen benutzen dieselbe Komponente • • • Anwendung P erwartet Version 1, der Komponente, Anwendung Q Version 2 Bei der Installation überschreibt die neue/alte Version der Komponente die vorher schon auf dem System vorhandene Eine der Anwendungen stürzt beim nächsten Start ab Eine Anwendung ist bei sehr vielen Clients installiert und greift auf eine Server-Komponente zu • • Die Server-Komponente wird ersetzt Clients stürzen ab • Bei genügend großen System ist es nicht möglich, veränderte Clients gleichzeitig mit einer neuen Server-Komponente zu verteilen Die Interface-Versionshölle Client und Server (Komponente) werden getrennt gepflegt • • • Clients arbeiten nicht mit neuen Server-Versionen zusammen • • Wenig Kontrolle über Zeitpunkt des Deployment Komponentenhersteller kennen nicht alle Clients Die Zahl der Clients ist zu groß für ein Deployment neuer Clients in Nullzeit Server-Schnittstelle wurde verändert Client erwartet alte Server-Schnittstelle Interface-Versionshölle • Microsoft nennt es plattformbezogener die DLL-Hölle Symptomkuren Minuziöse Interface-Verwaltung • • Microsoft Windows: Interfaces „von Hand“ in Typelibs pflegen Nach Deployment Interfaces nicht mehr ändern! • Bei Änderungen komplett neue Interfaces anlegen Versionskontrollwerkzeuge • • Microsoft Windows: z.B. Versionstamper von Desaware Installationswerkzeuge mit Versionskontrolle einsetzen Microsoft Windows: Windows Installer • Side-by-side Components Microsoft .NET • • Private Assemblies Shared Assemblies mit Versionsnummern Strong Typing als Grundproblem Strenge Typisierung • Methodensignaturen • Zugriff auf Parameter über Position auf dem Stack • (Reihenfolge in Signatur) Erwartung über die Byteanzahl von Parametern • Interfaces • Position von Methoden in einem Interface bestimmt deren „Adresse“ (z.B. Position in vtable) Streng Typisierte Interfaces sind „zerbrechlich“ (the brittle interface problem) • Hohe Performance • Relativiert sich in verteilten Architekturen • Kompatibilitätsprüfung zur Übersetzungszeit • Trügerische Sicherheit in verteilten Architekturen Strong Tagging Zugriff auf Parameter per Name (Tag) • • Reihenfolge/Position unerheblich • • Übergabe von Parametern in einer Container-Datenstruktur • • Einigung auf Name zwingend Stellung von Parametern in einer Hierarchie muss konstant bleiben Collection, PropertyBag, Recordset XML Verzicht auf „physikalische“ Typen • Empfänger führt Typwandlung explizit durch • Container-Datenstruktur kann jedoch auch Typen bewahren Vorteile I Strong Tagging unterstützt die InterfaceEvolution • • • • Hinzufügen von Parametern • Optionale Parameter erhalten Default-Werte Defaults können dynamisch bestimmt werden Wegfall von Parametern • „Überzählige“ Parameter werden ignoriert Positionsänderung von Parametern • Zugriff erfolgt per Parametername Typänderungen • Tolerant gegenüber „Typweitungen“ (Integer String) Vorteile II Strong Tagging vergrößert und flexibilisiert die Kontrolle in der Businesslogik • • • • • Fehlerbehandlung • Individuelle Reaktion auf Fehler möglich Zentraler Eintrittspunkt in Komponente • • Alle Komponentenaufrufe können über eine Methode als Eintrittspunkt abgewickelt werden Beliebige Abstufungen in der Granularität der Methoden möglich Zugriffs-/Transaktionskontrolle • Kontrolle kann so fein-granular wie gewünscht ausgeübt werden (z.B. in Abhängigkeit von Methode, Parameterwert/-konstellation, Benutzer, Tageszeit usw.) Parameter Routing • Parameter können verteilt oder an tieferliegende Schichten weitergeleitet werden Logging • Automatisches Logging von Parameterkonstellationen in besonderen Fällen inkl. Benachrichtigung des Admin Nachteile Keine Interface-Konformitätsprüfung zur Übersetzungszeit • • Hat in verteilten Architekturen nur begrenzten Wert Kann durch Wrapper-Klassen z.T. umgangen werden Geringere Performance • • Abhängig von Container-Datenstruktur Relativiert sich, je stärker Client und Server von einander getrennt sind Größeres Datentransfervolumen • • • Abhängig von Container-Datenstruktur Relativiert sich mit steigender Bandbreite Wird z.T. durch „spärlich gefüllte“ Parameterlisten wett gemacht Demos I Selbstbau eines Strong Tagging Containers • PropertyBag Strong Tagging und XML XML-Formate als ideale „Container“ • • • • Plattformunabhängig • Unterstützt über Schema-Sprache skalare Typen Kann beliebig komplexe Strukturen formulieren Bietet DOM als universelle Datenstruktur Einfacher Zugriff auch auf einzelne Parameter mit XPath SOAP? • • Nicht überall wo XML drauf steht ist auch Strong Tagging drin SOAP wurde im Hinblick auf streng typisierte Interfaces entwickelt • Letztlich hängt die Position von SOAP bzgl. Strong Tagging aber vom konkreten Gebrauch ab Microsoft .NET: Strong Tagging mit SOAP Extensions möglich XML-Grundszenario Dim s as String s = "<params>" s = s & "<name>Peter</name>" s = s & "<gebDat>31.5.1966</gebDat>" s = s & "<groesse>1,82</groesse>" s = s & "</params>" PersonAnlegen s Sub PersonAnlegen(Byval sXML as String) Dim xml as new MSXML.DOMDocument xml.loadXML sXML Dim rs as new ADODB.Recordset ... rs!dob = DateValue(xml.documentElement.selectSingleNode("gebDat").Text) ... End Sub Demos II Strong Tagging mit einem XMLbasierten Container • • COM/DCOM HTTP/ASP Wrapper-Klassen I Client Client-Klasse Function PersonAnlagen(Byval name as String, ...) as String Sub PersonLöschen(Byval id as String) Sub PersonÄndern(Byval id as String, Byval name as String, ...) Sub FamilienstandÄndern(Byval id as String, Byval fStand as Integer) Wrapper-Klasse XML ServerKomponente Function Execute(Byval cmdXML as String) as String Wrapper-Klassen II Verbergen der Strong TaggingKommunikation • Bieten lokales streng typisiertes Interface • • • Setzen Parameter um in ContainerDatenstruktur Unterstützen IntelliSense durch ausführliche Methodensignaturen Werden zusammen mit Client gepflegt • Nachführung bei Interfaceänderungen nicht sofort zwingend! XML-Repositorys Zentrale Sammelstelle für XML-Datenstrukturen • • Komponenten können Schemas zur Laufzeitvalidation von XML-Datenstrukturen laden Annotation von Schemas Zugriffsrechte Transaktionsattribute Log-Informationen usw. Deklarative Kontrolle von Strong Tagging-Aufrufen Tiefergeschachtelte Server-Komponenten/-Methoden müssen nicht verändert werden, wenn sich Kontrollinformationen ändern • Demos III Feingranulare Kontrolle in einer Strong Tagging Server-Komponente • Transaktionen auf Methodenebene Strong Tagging in der Praxis Strong Tagging ist kein rein theoretisches Konzept, sondern praxiserprobt • • • • Windows 2000 DNA Microsoft Site Server Commerce Edition Brokat Twister OpenX-Framework der Hamburger Verwaltung Bisher jedoch kein breit anerkanntes „Design Pattern“ • • Komponentenbasierte Entwicklung und verteilte Anwendungen sind vergleichsweise neu Die Strong Typing-Lobby ist zu stark Bsp. Windows 2000 DNA Einsatz von Recordsets als ContainerDatenstruktur • • • • Kommunikation zwischen Businesslogik und Frontend/Objektmodell Persistierbare Datenstruktur Transport von Datenbankinhalten • 2-dimensionale Datenstruktur Transport beliebiger, benannter und typisierter Daten Bsp. Commerce Server Scriptor-Komponenten • • Order Processing Pipeline (OPP) Nur eine Verarbeitungsmethode • Dictionary als Container-Datenstruktur Function MSCSExecute(config as Dictionary, orderForm as Dictionary, context as Dictionary, flags) as Long • Jede Komponente hat auf die für sie relevanten Parameter Zugriff, unabängig davon, wo sie in der Pipeline eingesetzt wird Bsp. Brokat Twister I Die e-Services Plattform Twister ermöglicht verteilte Anwendungsentwicklung nach dem Strong Tagging-Konzept • • • Einheitliche Methodensignatur für verteilte Objekte (RDOs) Jeweils einen Datenpool für Eingabe- bzw. AusgabeParameter mit beliebiger Parameteranzahl Transport einzelner Parameter Key/Value-Paare über sog. BAnythingPool-Container Erfolgreicher Einsatz in zahlreichen e-Business Anwendungen seit mehr als 5 Jahren • • • e-Banking (ABN Amro, first-e, Advance Bank, ...) e-Brokerage (Consors, Allianz, ...) e-Commerce (Postfinance,Telecash, … ) Bsp. Brokat Twister II Maximale Entkopplung von server- und clientseitiger Entwicklung • • • • Kein Generieren, Compilieren und Verteilen von objektspezifischen Stubs Clients können dynamisch auf die gesamte zur Verfügung stehende Funktionalität zurückgreifen Variable Parameteranzahl und Überprüfung zur Laufzeit Transparente Erweiterung von serverseitigen Schnittstellen Generische Verarbeitung ankommender Requests im Gateway • Umwandlung beliebiger Anfragen und Weiterleitung an Serverobjekte BAnythingPool inPool = new BAnythingPool(); BAnythingPool outPool = new BAnythingPool(); inPool.add("ItemID", "TW100021"); rdo.process("order", inPool, outPool); Bsp. OpenX-Framework I Framework für verteilte Anwendungen in der Hamburger Verwaltung • • • • Realisierung: BRP GmbH, Hamburg Ausgerichtet auf Windows NT/2000-Netzwerke Ab Juni 800 Anwender, später mehrere Tausend Transport der Parameter in PropertyBag-Objekten Strong Tagging hat sich in der Praxis bewährt: • Schnittstellen auf der Server-Seite ändert sich nie • Die Objekte/Daten sind „routbar“ • Eine späte Bindung mit unterschiedlichen Servern ist einfach • • • • möglich Der Datenverkehr kann aufgezeichnet werden Es besteht eine zentrale Transaktionsteuerung in nur einer Routine Standardisierung bei großen Objekten Einfache Kommunikation innerhalb von Anwendungsservern Bsp. OpenX-Framework II Client Server MTS Frontend PersonCli PersonSrv SQL Server Person-Objekt Streng typisierte Schnittstelle Aufruf der Execute-Methode Bsp. OpenX-Framework III Public Function Execute(ByVal v As Variant) As Variant Dim p_pb As New PropertyBag, p_objPers As Person 'Fehlerbehandlung und Transaktionscontext setzen ... p_pb.Contents = v Select Case p_pb.ReadProperty("oXObject_Name", "") Case "PERSONCLI" Set p_objPers = New Person Select Case p_pb.ReadProperty("oXObject_CMD","") Case "UPDATE" With Person .Contents = p_pb.Contents .update Execute = .Contents Call to Action Entgehen Sie der Interface-Versionshölle mit Strong Tagging • • • Prüfen Sie, wo Strong Tagging Sinn macht in Ihren Anwendungen Achten Sie auf die Performance Wählen Sie XML als persistentes ContainerDatenstrukturformat Erweitern Sie die Funktionalität Ihrer Businesslogik • • Richten Sie zentrale Eintrittspunkte ein Profitieren Sie von der feineren Kontrolle über Parameter Bauen Sie eine Kontroll-Infrastruktur auf • • Benutzen sie XML als Transportformat Annotieren Sie Ihre XML Schemas mit Kontrollinformationen Fragen? Ressourcen [And2000] Rick Anderson (Microsoft): The End of DLL Hell; http://msdn.microsoft.com/library/techart/dlldanger1.htm [Apple2000] Dan Appleman (Desaware): VersionStamper and DLL Hell - What's really going on here?; http://www.desaware.com/articles/VSBelieveL3.htm [Brokat] Informationen zu Twister: http://www.brokat.com/de/twister/index.html [Box2000] Don Box et al.: SOAP: Simple Object Access Protocol; http://msdn.microsoft.com/workshop/xml/general/soapspec.asp [Buch1994] Marcellus Buchheit: Die Gestaltung von APIs; BasicPro 3/94, S. 21 [Herz2000] Peter Herzum, Oliver Sims: Business Component Factory; John Wiley & Sons, Inc. 2000: Peter Herzum führt hier den Begriff “Strong Tagging” ein und erklärt das “Design Pattern” grundsätzlich. [Msft2000] Microsoft: Sharing Components – Terminology and Concepts; http://msdn.microsoft.com/training/offers/WINVBO_BLD/Topics/winvb00873.htm [Pat2000] Ted Pattison, Brian A Randell (Microsoft): Visual Basic Design Time Techniques to Prevent Runtime Version Conflicts; http://www.microsoft.com/msj/0100/versioning/versioning.asp [Sald1998] Alan Saldanha: Scriptor Component 101: Executing Scripts in a Pipeline Environment; http://msdn.microsoft.com/workshop/server/commerce/scriptor101.asp [Wong2000] Franky Wong (Desaware): DLL HELL: The inside story; http://www.desaware.com/articles/dllhellL3.htm