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!
 

Ralf Westphal (RW)

Hallo, Christian!

Auf der TechEd habe ich zum ersten Mal einen näheren Blick auf Indigo geworfen. Es ist doch irgendwie etwas anderes, ob ich hier und da mal einen Artikel lese oder mir ein Mensch auf der Bühne etwas demonstriert ;-)

Bisher hatte ich zu Indigo eher keine Meinung bzw. war eher skeptisch, dass Indigo viel mehr sein würde, als eine weitere Evolutionsstufe der Microsoftschen Kommunikationstechnologien wie .NET Remoting oder COM+ oder Web Services. Mit der TechEd hat sich mein Bild aber gewandelt. Ich bin jetzt der Meinung, dass Indigo ein wesentlicher Schritt nach vorne ist. Ich würde sogar fast von einem Quantensprung sprechen, einem Fortschritt, der dem von VB1 für die Windowsprogrammierung und von VB3 für die Datenbankprogrammierung entspricht. Kurz: Ich bin begeistert - auch wenn ich von den Details von Indigo noch nicht viel weiß.

Indigo ist cool! Sehr cool!
Aber Indigo ist auch erklärungsbedürftig.

Insofern meine Frage an dich: Kannst du mir ein Fragen beantworten?

Meine ersten beiden wären:

-Welchen Wert hat .NET Remoting, sobald es Indigo gibt? Ersetzt Indigo .NET Remoting?

-Was wird aus COM+, d.h. dem Application Server von Windows? Wird er überflüssig, weil ich ja ganz einfach aus jeder Consolen-Anwendung einen Indigo-Host machen kann?

Soviel fürs Erste. Bin gespannt auf erhellende Worte von dir.
Ralf

 

Christian Weyer (CW)

Na, das freut mich aber, dass dir das gefällt :) Ja, Indigo ist sehr cool, keine Frage.

RW: “-Welchen Wert hat .NET Remoting, sobald es Indigo gibt? Ersetzt Indigo .NET Remoting?“

CW: Ja und nein. .NET Remoting ist primär dafür gedacht, Kommunikation zwischen AppDomains und zwischen Prozessen auf einer Maschine zu erledigen.

Allerdings lässt sich Remoting auch in einem begrenzten Szenario verwenden, um verteilte Applikationen zu erstellen, die über Maschinengrenzen hinweg kommunizieren. Genau dieser letzte Punkt ist nun aber freilich die primäre Zielsetzung von Indigo. Im Gegensatz zu Remoting baut Indigo aber nicht auf das Konzept der verteilten Objekte, sondern vielmehr auf die Services-Idee. Es sind also zwei grundlegende Herangehensweisen, die sich eine ganze Zeit lang ergänzen werden. Vor allem für die Kommunikation innerhalb eines Prozesses zwischen zwei AppDomains wird man noch einige Zeit Remoting verwenden müssen, da Indigo v1 hier keine Lösung bietet.

RW: „-Was wird aus COM+, d.h. dem Application Server von Windows? Wird er überflüssig, weil ich ja ganz einfach aus jeder Consolen-Anwendung einen Indigo-Host machen kann?“

CW: Wieder ja und nein :) Gewisse Features con COM+ werden mit Indigo überflüssig. Als Beispiele kann man automatische und deklarative Transaktionsunterstützung heran ziehen. Indigo ist aber kein klasssicher Application Server, sondern vielmehr eine Plattform, die gewisse Funktionalitäten anbietet, aber keine Vorgaben macht, wo die Services, welche diese Features nutzen, ablaufen müssen. Doch dieser Umstand bedeutet nicht, dass nun jeder Entwickler seine Indigo Services in einer Konsolenanwendung oder einer anderen custom Application hosten soll. Um eine robuste, zuverlässige, skalierbare, sichere und verwaltbare Anwendungsarchitektur mit Indigo hinzubekommen, benötigt man ein universelles Hosting Model. So wie es bei COM+/ES und bei IIS/ASP.NET der Fall ist. Und genauso wie man Remoting eigentlich auch verwenden sollte. Für Indigo (und auch andere Teile von Windows und WinFX) wird es daher den WAS geben. Der Windows Activation Service stellt viele der oben genannten Qualitäten zur Verfügung und ist nicht an eine Technologie zur Kommunikation mit der Anwendung oder dem Service gebunden. TCP, UDP, Named Pipes, HTTP oder Queuing - Services können über all diese Protokolle mittels Nachrichten aktiviert werden.

 

RW

Hi, Christian!

Da hast du dich ja schön mit "Ja und Nein"-Antworten auf der Affäre gezogen :-) Um´s für mich klarer zu kriegen, versuche ich mal eine Zusammenfassung:

-.NET Remoting hat auch mit Indigo seine Berechtigung für die RPC-Kommunikation zwischen AppDomains bzw. Prozessen auf der selben Maschine, weil Indigo keine RPC-Kommunikation in dieser (einfachen, intuitiven) Weise bietet.

-COM+ hat auch mit Indigo noch seine Berechtigung, weil es als Host Dienste bietet, die Indigo nicht bietet. Indigo ist eine Kommunikationstechnologie, COM+ ist ein Host. Allerdings hat COM+ als Host bisher auch Kommunikationsarten bzw. -kanäle angeboten. Das bedeutet umgekehrt: COM+ wird obsolet für kommunikationsorientierte Features wie asynchrone Kommunikation, für andere Features behält es seinen Wert. Nur weil ich asynchron kommunizieren will, muss ich nicht mehr Queued Components einsetzen. Nur weil ich durch Transaktionen sicherstellen will, dass mein Empfänger seine Arbeit ganz oder gar nicht erledigt, muss ich keine transaktionale Serviced Component in COM+ aufhängen.

Die COM+ Features, die aber nichts mit Kommunikation, sondern mit Hosting zu tun haben, mach auch in Indigo-Zeiten noch Sinn: Rollenbasierte Sicherheit, Object Pooling, Loosely Coupled Events.

Wie sieht es aber aus mit Just in Time Activation? Kann ein Indigo-Service zustandsbehaftet sein, d.h. über einen Operationenaufruf hinaus existieren?

Und umgekehrt: Macht es Sinn über einen Indigo-Service als COM+-Applikation oder in einer COM+-Applikation nachzudenken? Oder kann ich mich nur zwischen Indigo und COM+ entscheiden, wobei es bei den Kommunikationsfeatures einen gewissen Overlap gibt?

Der Windows Activation Service (WAS) kling ja spannend. Kannst du dazu noch ein paar Worte verlieren. Was muss ich mir darunter vorstellen? Eine EXE-Datei, d.h. einen Service, in den ich mich einhängen kann, wenn ich z.B. eine bestimmte Schnittstelle implementiere? Oder umgekehrt eine Komponente, die ich in meiner Console.EXE instanzieren kann?

So, jetzt zum Abschluss nochmal kurz zu .NET Remoting bzw. RPC: .NET Remoting und COM+ und die "normalen" Web Services sind ja alle RPC-Technologien, d.h. ich rufen Objekte in einem anderen Prozess auf. Im Client sehe ich eine Methode mit möglicherweise vielen Parametern und bekomme vielleicht einen Resultatswert zurück. Das ist zumindest sehr bequem vom Programmiermodell her. Die "Entfernung" des Serverobjektes zum Client ist transparent.

Und jetzt sagst du, genau das würde Indigo (noch) nicht bieten. Korrekt?

Aber was bietet denn Indigo dann, wenn ich meinen Service so nicht aufrufen kann?

Und wenn Indigo schon kein bequemes RPC bietet, dann hat das sicher seinen Grund. Ok. Aber warum sollte ich dann überhaupt noch etwas anderes machen, als Indigo bietet. Ist dann von RPC nicht per se eher abzuraten?

Du siehst, trotz (oder wegen) meiner Begeisterung sind noch viele Fragen offen :-)
-Ralf

 

CW

Ich möchte noch kurz auf Deine Zusammenfassungen eingehen:

Ja, Indigo ist so absolut kontra-RPC. Hinzu kommt eben das technische Detail, dass die die Kommunikation über AppDomain-Grenzen hinweg in optimierter Art und Weise nur mit Remoting möglich ist (Stichwort: CrossAppDomainChannel).

Und COM+'s LCE haben durchaus mit Kommunikation zu tun, IMO.

Indigo Services können über entsprechende Konfiguration durch Verwendung von Attributen auch zustandsbehaftet sein, ja.

Du musst dich nicht zwischen COM+ oder Indigo entscheiden. Beide können schiedlich friedlich koexistieren. Auf der einen Seite gibt es Integrationsmechanismen, über die Indigo Clients COM+-Anwendungen und COM/COM+-Anwendungen Indigo Services aufrufen können - ohne etwas am Code ändern zu müssen oder speziellen Code schreiben zu müssen.

Auf der anderen Seite kann es freilich von einem Architekturstandpunkt her Sinn machen, einen Indigo Service zu schreiben, der dann sozusagen als Facade in eine existierende COM+-Applikation hinein zeigt.

Ja, WAS ist hoffentlich das, was man sich immer gewünscht hat. WAS ist ein NT Service, der im System läuft. Um ihn zu nutzen, musst du einfach nur die richtigen Konfigurationsdateien schreiben, fertig. Die Details hierzu sind noch nicht spruchreif, da das Ganze erst mit Longhorn kommen wird.

Jaja, die Geschichte mit dem RPC. RPC ist eine "natürliche" Erweiterung eines lokalen Programmiermodells, welche zugegebenermaßen sehr verführerisch und sexy ist, weil einfach. Einfach zu verstehen (man muss nämlich nichts denken) und einfach anzuwenden.
Doch RPCs sind gleichermaßen eng gekoppelt wie lokale Aufrufe auf Objekte oder Komponenten. Mit RPC ignoriert man regelrecht essentielle Faktoren wie Latenz, mögliche Fehler und Concurrency, die fehlende Kontrolle über andere Systeme und nicht zuletzt das Nichtvorhandensein einen "gemeinsamen Speicherbereiches".
Das haben übrigens schon Waldo & Co. (Technologie-Päpste aus der Java-Welt) in einem exzellenten Paper aus dem Jahre 1994 festgestellt: http://research.sun.com/techrep/1994/abstract-29.html

Und dennoch tun wir es, einfach so... :(
Unser Freund Gregor Hohpe sagt immer:

“As applications become more interconnected, asynchronous messaging is likely to be the next big architectural trend. Similar to the shift from procedural to object-oriented programming, we need patterns and best practices to help us master the new paradigm.”

Ich meine, dies sagt schon viel und kann auch als eine der Motivationen hinter Indigo gesehen werden. Patterns und Guidance ist gut. Dieses gemischt mit einer dazu passenden Plattform: voila.

 

RW

Das ist ja eine sehr deutliche Aussage: "Indigo ist [...] absolut kontra-RPC"
Macht das Indigo unattraktiv für viele Entwickler? .NET Remoting und COM+ sind so schön einfach.

Und so ganz verstehe ich es auch noch nicht, dass Indigo so kontra RPC ist, denn auch in Indigo kann ich ja einen Service Contract (also die Operationen eines entfernten Dienstes) in Form von Methoden (eines Interface) mit "normaler" Signatur definieren, oder?

Indigo wird also (zunächst) kein spezielles Binding für cross-AppDomain Kommunikation anbieten? Wenn ich Indigo in so einem Szenario einsetzen will, dann muss ich auch dort TCP/IP als Medium benutzen?

Aber schon mal interessant zu hören, dass ein Indigo-Service zustandsbehaftet sein kann. Wenn ich mir dafür einen Proxy bauen lasse, dann zeigt der immer auf dieselbe Instanz im Server. Wie ist da die Lebensdauer der Serviceinstanz geregelt?

Gut zu hören, dass ich mit Indigo auf COM+ Anwendungen zugreifen kann - und umgekehrt. Beides bleibt aber verschieden. Auch bei der von dir beschriebenen Indigo-Fassade vor einer COM+ Applikation. Indigo würde dann ja nur so eingesetzt wie vielleicht heute mancher Web Service.
Indigo "in" einer COM+ Anwendung gibt es dann aber eben nicht... Ok. Verstanden.

WAS hört sich wirklich interessant an. Klingt nach Verallgemeinerung dessen, was heute COM+ dllhost.exe und IIS/ASP.NET oder eine Console.EXE bieten: In ihnen kann ich Code "aufhängen" (hosten lassen), der dann über den einen oder anderen Kommunikationskanal aufgerufen werden kann. Gut, wenn es dafür in Zukunft nur noch einen Host gibt - der dann aber hoffentlich auch vernünftig zu administrieren ist. Das Deployment gerade von COM+ Applikation hat deren Verbreitung ja nicht gerade gefördert. Hast du einen Link, wo man mehr zu WAS erfahren kann?

Deine Klage bzgl. RPC kann ich sehr gut verstehen. RPC ist verführerisch :-) Ich muss vom Programmiermodell her nichts dazu lernen und kann trotzdem, quasi magisch, auf entfernte Software zugreifen, als sei sie lokal. (Entfernt heißt hier "in einem anderen Speicherbereich". Das kann ein anderer Rechner sein, es reicht aber auch nur eine andere AppDomain.)

In Wirklichkeit kaschiert RPC aber nur, dass unten drunter die Kommunikation fundamental (!) anders ist: nicht mehr Stack-basiert, sondern Stream-basiert. Gregor Hohpe hat einige Unterschiede dieser Kommunikationsarten in einem Blogposting herausgearbeitet (http://www.eaipatterns.com/ramblings/31_techededa.html)

-Die Koordination/Zusammenarbeit von Client (Aufrufer) und Server (Aufgerufenem) funktionieren anders.
-Was nach dem Anstoß einer Operation im Server passiert, wird anders geregelt.
-Client und Server haben einen anderen Kontext.

Dazu kommen Latenzzeiten für die Übermittlung von Daten zwischen Client und Server, möglicher Ausfall von Übertragungsweg oder notwendiger Infrastruktur (Hardware/Software), Sicherheitsaspekte usw.
RPC ist einfach so, so sehr prinzipiell anders als ein lokaler Methodenaufruf, dass ich heute fast nicht mehr verstehe, warum RPC-Kommunikation überhaupt in so hohem Ansehen steht. (Naja, die Antwort lautet wohl: Bequemlichkeit und Verständlichkeit.)

Ein weiterer Grund dafür, dass RPC nicht als etwas kategorial anderes angesehen wird/wurde, liegt meiner Meinung nach in einer fehlenden Systematik der Softwareentwicklungsmodelle. Wenn über Software geredet wird, dann scheinen die Artefakte, um die es geht, oft auf einer einzigen bzw. der einzigen Abstraktionsstufe (oder Technologiestufe) zu liegen. Bei OOP spricht man über Methoden und Klassen und meint, Software würde daraus gebaut. Bei SOA spricht man über Services und hat Methoden und Klassen nicht im Blick. Komponentenorientierte Entwicklung dreht sich um Zusammenfassungen von Klassen - aber interessiert sich eigentlich nur für einen Prozess.

So reden die Vertreter von OOP, CBD (Component Based Design) und SOA munter aneinander vorbei. Missverständnisse sind unvermeidlich.

Wie könnte es besser laufen? Ich glaube, es würde besser laufen, wenn allen klar wäre, dass die Artefakte, über die sie sprechen, Teile eines Kontinuums wären. Sie stehen nicht isoliert in der Gegend herum, sondern hängen zusammen. Methoden, Klassen, Komponenten und Services usw. bilden vielmehr eine Hierarchie. Vereinfacht könnte sie so aussehen:

Service
  Applikation
    Komponente
      Klasse
        Methode

D.h. Services bestehen aus Applikationen (Prozesse), Applikationen bestehen aus Komponenten, Komponenten bestehen aus Klassen, Klassen bestehen aus Methoden.

Innerhalb der Hierarchie findet Kommunikation auf allen Ebenen statt: Methoden rufen Methoden auf. Klassen benutzen andere Klassen, Komponenten andere Komponenten. Applikationen rufen andere Applikationen und Services andere Services.

Und jetzt noch ein Schritt: In dieser Hierarchie gibt es nur zwei Ebenen, auf denen sozusagen physikalisch wirklich kommuniziert wird:

-Methoden rufen andere Methoden per Stack auf
-Applikationen kommunizieren mit anderen Applikationen per Stream (d.h. nachrichtenorientiert)

Methoden kommunizieren immer nur direkt miteinander innerhalb (!) einer Applikation, d.h. einem Prozess bzw. Speicherbereich.
Applikationen kommunizieren über Speicherbereichsgrenzen hinweg.

Damit sage ich nichts Neues. Neu ist jedoch die Übersicht, die die Hierarchie der Artefakte hier bietet. Neu ist das Kontinuum, in dem sich nun OOP, CBD und SOA verorten können.
OOP und CBD befassen sich mit Artefakten und Kommunikation innerhalb (!) von Applikationen.
SOA befasst sich mit Artefakten und Kommunikation ab (!) der Applikationsebene in der Hierarchie.

Mit einer so klaren Zuordnung der Artefakte und Denkmodelle sollte klar sein, dass SOA und das bisherige OOP sich mit ganz unterschiedlichen Dingen befassen. Und das bedeutet, dass die OOP-Fraktion nicht versuchen sollte, ihre Denkweise in die SOA-Welt zu übertragen. Schön wäre es vielleicht... Aber da die Kommunikationsweise bei Übergang von Komponente zu Applikation prinzipiell wechselt, wäre es kontraproduktiv bzw. naiv, diesen Bruch nicht zur Kenntnis nehmen und kaschieren zu wollen.

Dadurch, dass die Kommunikation zwischen Applikationen so explizit ist - d.h. viele Optionen an Medien bietet, viel Infrastruktur erfordert, nicht in quasi Nullzeit erfolgt -, gibt es einfach viele Schrauben, an denen gedreht werden kann und "Rädchen im Getriebe", die ausfallen bzw. von unterschiedlicher Qualität sein können.

Da Indigo eine SOA-Technologie ist, weil sie die Kommunikation zwischen Applikationen zum Thema hat, finde ich selbst es also nicht schlimm, wenn sie kein RPC unterstützt. Ich würde sogar sagen: .NET Remoting und COM+ und Web Services (im Jahr 2000) so einfach bzw. RPC-orientiert zu gestalten, war ein Fehler, der zu vielen Missverständnissen geführt hat und noch führt.

Puh... soviel mal als Statement von mir heute :-)

 

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