ServicesResourcesConferences Our TeamWeblogsAboutContact
     

Developer Resources

  Architecture Briefings
  .NET Remoting FAQ
  Articles
  Conversations
  Tools and Samples
  Books










Die thinktecture-Gespräche: Indigo

NavigationSeite 1  -  Seite 2  -  Seite 3

Feedback: Sagen Sie uns, wie Ihnen unsere thinktecture-Gespräche gefallen!
 

RW

Ja, so sehe ich es auch: Wir als Technologievermittler sollten nicht immer zeigen, was geht, sondern was sinnvoll ist. Wir haben auch eine Filterfunktion - und manches sollte da halt auch mal hängenbleiben, so z.B. die RPC-Notation für Indigo-Dienste. Einfach nicht zeigen. Fertig.

Ich bin immer dafür, dass die Dinge möglichst so aussehen, wie sie sind. Wenn Kommunikation essenziell nachrichtenorientiert ist, dann sollten die dafür nötigen Mittel im Code das widerspiegeln. Aus dem Grund wünsche ich mir ja auch eine spezielle Notation für Schnittstellen. Eine DSL, in der Dienste nur Operationen definieren können und Datenstrukturen nur Daten enthalten. Heute werden dafür GPLs benutzt, mit denen ich Diensten syntaktisch korrekt auch Daten geben kann und Daten Methoden. Das führt zu Missverständnissen. IDLs (Interface Description Languages) wie noch zu Zeiten von COM und heute noch bei CORBA sind irgendwie in Ungnade gefallen - wie ich finde zu unrecht. Man hat das Kind mit dem Bade ausgeschüttet.

Eine Indigo Message ist also die Manifestation einer SOAP-Nachricht als Objekt. Sehr interessant. Bei .NET Remoting gibt es ja auch Message-Interfaces (und dahinter stehende Klassen), aber die sind proprietär. Das Programmiermodell ist nur durchaus unterhalb der RPC-Schicht ähnlich. Mit Indigo basieren die Nachrichten auf einem Standard. Gut so.

Da du aber sagst, dass eine Indigo Message bei ihrer Reise zwischen Client und Service nicht notwendig nach XML serialisiert werden muss, stehen Message und SOAP XML in einem Verhältnis zueinander wie XML DOM und XML. Hier ein Objektmodell, dort eine nach XML serialisierte Form. So wie es für XML ein Infoset gibt, gibt es also für SOAP auch ein "SOAP Infoset", d.h. eine abstrakte Definition einer Hierarchie von "Entitäten"?

Wird denn mein eigener Nachrichtentyp, z.B. ReservationRequest, intern erst in ein Message-Objekte gewandelt und dann erst "auf die Leitung gelegt"? Hm... muss ja eigentlich, denn die generischen Schichten von Indigo wollen ja eine einheitliche Sicht haben, um ihre WS-* Header reinzuhängen und was nicht sonst noch alles tun zu können. Das bedeutet für mich dann auch, dass Indigo ein ähnliches Erweiterungskonzept wie .NET Remoting haben muss: Es wird eine Pipeline von Interceptoren geben, die beim Client und Service in einem Indigo-"Kanal" hängen, oder? Jeder Interceptor kann dann eine WS-*-Leitung erbringen oder etwas von mir selbst definiertes tun. Microsoft hat mit .NET Remoting also erstmal/schonmal geübt :-)

Im nächsten Schritt würde das für mich aber auch bedeuten, es gibt eigentlich kein Hindernis, Indigo auch zwischen AppDomains einzusetzen. Ich muss nur einen eigenen "Kanal" und (De)Serialisierer entwickeln, der ähnlich effizient arbeitet. Das Programmiermodell der nachrichtenorientierten Kommunikation macht ja auch Sinn zwischen AppDomains, denn per stackbasierte Aufrufe funktionieren auch dort nicht.

 

CW

Bruder, Du schweifst ab ;) Aber über die Sache mit den Schnittstellen und DSLs können wir uns gerne mal gesondert unterhalten. Wie Du weißt habe ich da meine ganz eigene Sicht und Ideen dazu :)

So, ja. Indigo ist extrem erweiterbar. Man kann sprichwörtlich alles ersetzen oder überall in der Indigo-Architektur Sachen dazu bauen, ganz leger gesprochen.

Aber mit der Cross AppDomain-Kommunikation via Indigo ist es leider nicht ganz so einfach wie man erst vermuten mag. Wir haben uns über die IPC Story für V1 unterhalten. Sie ist recht einfach:
Remoting für Cross AppDomain, Intra Process. Ansonsten Indigo. Es gibt eine Reihe an mitgelieferten Channels. TCP, HTTP, MSMQ, Named Pipes,PeerNet. Die Idee ist nun, einen Indigo Custom Channel für Intra-Prozesskommunikation zu bauen und den CrossAppDomainChannel von Remoting zu verwenden. Dieser ist freilich nicht direkt zugänglich, da internal. Aber es sollte genügen, einfach ein remotable Objekt über eine AppDomain-Grenze bereit zu stellen - also implizite Nutzung des CrossAppDomainChannel. Ziel ist, dass Entwickler *eine* Plattform und *ein* Programmiermodell verwenden, um jegliche Art von "Anwendungskommunikation" zu implementieren.

Man müsste jedoch den Indigo Formatter verwenden und dann wäre die Performance um einiges schlechter als die von .NET Remoting Cross Appdomain. Der Grund warum der Remoting Formatter ausfällt ist, dass dieser einfach transparent MarshalByRefObjects (die *irgendwo* in den Parametern versteckt sein können ... also auch irgendwo "tief" unten) als Remote-Komponenten überträgt. Es wäre dann aber der Backchannel .NET Remoting und nicht Indigo.

Führt also eher zu massiver Verwirrung ...

 

RW

Hey, hey, wo bin ich denn abgeschweift? Weil ich über die Interna von Indigo nachgedacht habe, dass alle Nachrichten am Ende wohl in ein Message-Objekt ungesetzt werden, dass die Grundarchitektur von Indigo wohl so wie bei .NET Remoting aussieht? Oder die Spekulation über ein "Indigo Infoset"? Ich empfinde das nicht als Abschweifen, sondern als konstruktiv im Sinne eines Versuchs einer Synthese (als Gegensatz zur Analyse) von etwas, dessen "Innereien" ich nicht wirklich kenne. Ich hätte mir da von dir auch Bestätigung oder Korrektur gewünscht, wenn du darüber etwas weißt. Ich möchte ja mehr über Indigo erfahren, die Prinzipien verstehen.

Den Gedanken einer DSL für die Schnittstellendefinition können wir natürlich ein andermal vertiefen.

Mit der "IPC Story" meinst du Microsofts Story. Microsoft sagt, "Wir haben doch eine funktionierende intra-AppDomain Technologie, warum dann gleich Indigo auch noch dafür passend machen?" Ok, das kann ich verstehen. Und ich fände es sogar akzeptabel, wenn das so bliebe. Klare Abgrenzungen/Profile finde ich am wichtigsten, nicht unbedingt Simplizität - auch wenn die schön ist.

Und so wäre es natürlich auch schön, wenn Indigo schon demnächst nicht nur grundsätzlich, sondern auch effizient zwischen AppDomains funktionieren würde. Dann wäre das Programmiermodell für alle entfernten Operationen einheitlich. Das wäre schon cool. Wow! Gehen tut das natürlich heute auch schon. Ich kann ja, wenn ich will, Indigo zwischen AppDomains innerhalb desselben Prozesses einsetzen. (Denn wenn wir genau sind, dann kommunizieren ja auf .NET immer AppDomains miteinander und nicht Prozesse.) Wem also Einheitlichkeit wichtig ist und nicht maximale Performance, der kann sie schon heute haben und wartet dann vielleicht ein bisschen, bis jemand einen speziellen cross-AppDomain Indigo-Channel usw. gebastelt hat. Ob das dann er .NET Remoting Channel ist oder nicht, ist ja egal.

Wer Effizienz will, für den sieht Kommunikation morgen also so aus:
-Intra-AppDomain: stackbasiert
-Intra-Applikation, cross-AppDomain: .NET Remoting
-Inter-Applikation: Indigo

Wer Einheitlichkeit bzw. Einfachheit haben will, der geht so vor:
-Intra-AppDomain: stackbasiert
-Intra-Applikation, cross-AppDomain: Indigo
-Inter-Applikation: Indigo

Das wäre dann Einheitlichkeit im Programmiermodell (nachrichtenorientiert), Einheitlichkeit im Denken (nachrichtenorientiert), Einheitlichkeit in der Technologie (Indigo) für die gesamte entfernte Kommunikation.

Ich jedenfalls würde immer - wenn es irgend geht - zum Weg der Einheitlichkeit raten. (Intra-Applikation cross-AppDomain Kommunikation ist ja auch nicht so häufig. Wenn Software heute verteilt wird, dann meist gleich auf mehrere Prozesse.)

Für mich stellt sich in dem Zusammenhang auch gleich die Frage: Was ist das Essenzielle an Indigo? Was ist wirklich, wirklich wichtig? Bei .NET Remoting hat sich das erst nach 1-2 Jahren herauskristallisiert. Zur Erklärung von .NET Remoting ist es in 90% aller Fälle nicht nötig, ein Wort über RealProxy oder Kontextattribute zu verlieren. Das Zeugs gibt es - aber keiner braucht es (bzw. fast niemand). Gut dass es das alles gibt - aber es ist letztlich für 90% aller Entwickler irrelevant.

Und wie lautet die 90%-Botschaft für Indigo? Das, was man heute darüber hört, ist sie noch nicht. Zuviele technische Details.

 

CW

Bei den DSLs bist Du ein wenig abgeschweift. Aber das klären wir später.

Ich denke bisher habe ich alle Deine Fragen beantwortet oder? Oder welche Fragen zu den Innereien sind offen? Immer raus damit. :)

OK, back to topic:
Deine Analyse zu Effizienz und Einfachheit passt! Am Ende des Tages muss man dann bei der Optimierung einer Applikation schauen, ob man nicht der Effizienz den Vorrang ggü. Der Einfachheit gibt. Klar.

Hier ist meine Variante der 90%-Botschaft von Indigo - wobei ich selbst ständig auf der Suche bin, diese Botschaft zu verbessern:

Die Zukunft der erfolgreichen Kommunikation liegt in der Entkopplung. Entkopplung erreicht man durch ein nachrichtenorientiertes Denken und Handeln. Indigo ist *die* Plattform - als Laufzeitumgebung und als Programmiermodell - um Nachrichtenorientierung wahr und greifbar werden zu lassen. Alles andere ist Implementierungsdetail. Das kann man dann in den anderen 10% betrachten.

 

RW

Mit deinem Credo, die Zukunft der erfolgreichen Kommunikation liege in der Entkopplung, stimme ich komplett überein. Da wir hier über Indigo sprechen, möchte ich es aber noch erweitern und formulieren: Die Zukunft der Softwareentwicklung liegt in der rigorosen Identifikation von Komponenten (jeder Granularität) und deren angemessener Entkopplung. Bei Indigo geht es ja quasi natürlicherweise immer um die Kommunikation von "Komponenten". Es sind die zu verbindenden Prozesse (lassen wir AppDomains mal außen vor). Und Prozesse (bzw. die dahinter stehenden Lösungen) existieren entweder schon oder ich muss mindestens einen pro neuer Lösung schaffen. Jeder Prozess bildet per definitionem eine klar identifizierbare Einheit und ist damit ganz natürlich eine Komponente bzw. ein Komponentenkandidat. Entwickler können sich nicht wehren, Prozesse zu erschaffen. Und darauf beziehst du dich erstmal und sagst zurecht: "Leute, überlegt euch gut, wie die Schnittstellen eurer Prozesse aussehen und wieviel kommunizierende Prozesse übereinander wissen müssen! Entkopplung ist eine Tugend!"

Ich dagegen komme von der prozessinternen Architektur her. Und da sehe ich zunächst einmal eine große Not, innerprozessliche Komponenten zu schaffen. Die ergeben sich nämlich nicht einfach so ganz natürlich. Da haben Entwickler immer wieder eine Wahl - und entscheiden sich oft gegen eine echte Komponentenorientierung. Software in Klassen/Typen aufzuteilen, ist zu wenig. Und Software aus mehreren eigenen Assemblies zusammenzusetzen, ist auch noch zuwenig (wenn auch schon ein Schritt voran ;-)

Zum echten komponentenorientierten Denken gehört der Wille zur Entkopplung der Komponenten.

Die erste Frage lautet: Was sind geeignete Komponenten für eine Software?

Die zweite Frage lautet: Wie sieht eine angemessene Schnittstelle aus? (Und damit geht das Nachdenken über Entkopplung einher.)

Für mich ist das dann auch nicht nur eine Frage der Softwarearchitektur, sondern des Softwareentwicklungsprozesses. Eine Architektur braucht auch immer einen geeigneten Prozess, um sie zu verwirklichen. Konkret heißt das: Wer zwar komponentenorientiert entwirft, diese Entkopplung der Software dann aber nicht im Team lebt, der erreicht das Ziel nicht.

Zum Abschluss noch eine konkrete Frage zu den Innereien von Indigo:
Wenn ich zwischen Client C und Service S einen Indigo-Contract definiere und in dem Contract taucht Klasse D auf, um Daten zu transportieren, dann ist das zunächst einmal eine hübsche Definition, mit der ich Code auf der Client- und Serviceseite schreiben kann.

Für mich ist die Klasse D jedoch wirklich nur eine Klassen für den Datentransport. Würden C und S nicht über Indigo kommunizieren, sondern innerhalb desselben Prozesses leben, bräuchte ich D nicht. Dann würde ich nämlich Objekte der Klasse O direkt als Referenz z.B. aus S an C rausreichen. Aus Sicht der Problemdomäne, für die die Kombination C+S eine Lösung darstellt, ist also nur O nötig. Wenn dann aus nicht-funktionalen Anforderungen heraus (z.B. Skalierbarkeit) entschieden wird, C und S zu verteilen, dann brauche ich zusätzliche Technik (Infrastruktur), dann kommt Indigo ins Spiel. Und nur für diese Technik ist dann D nötig. Auf Seiten von S habe ich ein O-Objekt, muss es aber in eine D-Instanz umkopieren, dann verschickt Indigo es serialisiert an die Client-Seite, dort wird daraus wieder eine D-Instanz - die wieder in ein O-Objekt gewandelt werden muss. S und C denken also in O-Objekten, die Kommunikation ist nur an D interessiert.

Wenn du dem zustimmst, dann hier endlich meine Frage: Bietet Indigo eine Hilfe, um O-Objekte in D-Instanzen zu transformieren (und umgekehrt)? Ich halte das für ein Problem, dass letztlich an jeder Indigo-Schnittstelle auftritt. Meine Geschäftslogik interessiert sich nicht für die Details der Kommunikation zwischen Komponenten, sie ist insofern technikfrei. In meiner Geschäftslogik kommt nichts von ADO.NET vor, nichts von WinForms und nichts von Indigo. D ist jedoch ein Indigo-abhängiges Detail. Hilft mir Indigo, die Kommunikationsadapter, die ich schreiben will, um meine Geschäftslogik technikfrei zu halten, übersichtlich zu halten und nicht Unmengen an Transformationscode schreiben zu müssen?

Bin gespannt auf deine Antwort!

 

CW

Oh wie ich diesen Satz liebe: Entkopplung ist eine Tugend - prima! Jaaa!

Viele Entwickler wurschteln heutzutage einfach viel zu viel vor sich. Getreu dem Motto: naja, schaun mer mal ob ich das hinbekomme, wird schon gehen, schön machen wir es danach. Nur: es macht keiner mehr "schön". Das Gewurschtel bleibt; das Geschwulst wächst und nach einiger Zeit jammern die Entwickler, deren Chefs (und im Extremfall auch noch der Kunde), dass alles ja sooo komplex und kompliziert ist. Hier muss sich etwas ändern, absolut.
Und die *Denkweise*, die wir hier sozusagen zunächst implizit propagieren muss explizit werden - es muss aktiv nach außen getragen werden, dass so, wie wir die Anwendungs- und Komponentenkommunikation in einer Vielzahl von Projekten bisher gemacht haben, nicht mehr funktionieren wird und kann. Indigo - und ich wiederhole mich hier gerne - wird diesen Umstand auch nicht von heute auf morgen auf der Welt wischen, nein! Indigo wird ein tolles Werkzeug werden, welches aber dennoch richtig angewendet werden muss.

Es ist also mehr, als ein API und eine Plattform zu lernen und zu verinnerlichen. Die ganze Sache fängt weit vor dem Code, vor VS, vor dem Keyboard und der Maus an: nämlich im Kopf. Und das ist meines Erachtens die schwierigste Hürde, die wir nehmen müssen.

Dabei reden wir heute eigentlich wieder über Dinge, die damals zu COM-Zeiten schon gepredigt wurden, aber durch "unglückliche" Tools und Evangelisierungsmaßnahmen leider gescheitert sind: Schnittstellen, Schnittstellen, Schnittstellen!!!

Nun aber zu Deiner konkreten Frage wenn es um den Tausch von Daten und Metadaten in einem mit indigo implementierten Szenario geht.
Wie Du schön feststellst, ist D nicht wirklich eine typische Klasse im klassischen OO-Sinne, sondern vielmehr was Martin Fowler als Data Transfer Object (DTO) bezeichnet (http://www.martinfowler.com/eaaCatalog/dataTransferObject.html, http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpatterns/html/DesDTO.asp).
Nun stehen wir aber vor exakt dem von Dir beschriebenen Problem, der manuellen Umkopiererei. Und die Lösung heißt - mal wieder - Schnittstellen und Patterns. Die interne Implementierung eines Services, also bspw. das was wir gemeinhin als Geschäftslogik bezeichnen, implementiert eine interne Schnittstelle. Der Service selbst, in diesem Falle mit Indigo umgesetzt, implementiert die öffentliche Schnittstelle, in der D definiert ist. Jetzt ist es quasi "Zufall", dass diese öffentliche Schnittstelle gerade mit Indigo implementiert wird, sie könnte aber ebenso gut mit ASMX, Enterprise Services oder-was-weiss-ich implementiert werden. Dieses Problem und die Lösung sind völlig unabhängig von Indigo.

Um nun die Umsetzung von interner nach externer Schnittstelle und wieder zurück hinzubekommen bedient man sich des Adapter Patterns. Ja, dies ist händischer Aufwand, der unter Umständen immer wieder neu geschrieben werden muss je nach Projekt und Szenario. Also brauchen wir Automatismen und Tools, die uns hier helfen!

Nein, Microsoft selbst wird in Visual Studio keinerlei Unterstützung für derartige Szenarien einbauen. Aber es gibt eine Hoffnung: wir von thinktecture, also vor allem ich, arbeiten mit Microsoft EMEA und Microsoft Corp. an einer Erweiterung für Visual Studio 2005, die sich eben genau diesem Problem annimmt. Wir sind gerade in der Spezifikationsphase, eine frühe Version wird auf der PDC in LA gezeigt. Aber ich kann dir versichern, dass all das, was Du und ich hier über Schnittstellen und Patterns und die damit verbundenen Probleme diskutiert haben, mit diesem Tool adressiert werden soll. Unabhängig von Indigo. Ja, Indigo und AMSX und ES werden als Technologien unterstützt werden in diesem Tool.

Es bleibt spannend.

Es gibt also viel zu tun, Ralf. Packen wir es an!

 

NavigationSeite 1  -  Seite 2  -  Seite 3

Feedback: Sagen Sie uns, wie Ihnen unsere thinktecture-Gespräche gefallen!

 

© 2002 - 2006 by Thinktecture, Ingo Rammer and Christian Weyer. All rights reserved. | Contact | Impressum