Ich arbeite mit WCF 4.0 und habe eine gute Vorstellung davon, wie man Dienste vom technischen Standpunkt aus erstellt. Ich arbeite nun schon seit 3 Jahren mit WCF.
Trotzdem haben ich und andere, mit denen ich spreche, unterschiedliche Vorstellungen davon, was die Einheit der Software sein sollte, die einen Dienst ausmacht, und was nicht. Viele Leute, mit denen ich spreche, sind der Meinung, dass Dienste granular sein sollten. In der Tat hat mein früheres Unternehmen viel Zeit damit verbracht, einige seiner Baugruppen in Dienste umzuwandeln (so wurde es mir gesagt).
In vielen Fällen kann ich nicht erkennen, wie ein Dienst besser sein soll... und vielleicht soll er das auch nicht immer sein. Ich werde Ihnen ein Beispiel geben: In unserem System haben wir einen großen Dienst, der eigentlich zwei verschiedene unabhängige Aufgaben erfüllen sollte. Ich werde ihn in zwei Dienste aufteilen, und zwar aus zwei Gründen: Leistung und Fehlerisolierung (wir hosten selbst in einem Windows-Dienst, kein IIS). Das Problem ist, dass beide Dienste, obwohl sie zwei unabhängige Geschäftsprozesse bedienen (ein Dienst kann ausfallen, ohne den anderen zu beeinträchtigen), einen großen Teil der Geschäftslogik gemeinsam haben.
Nun raten mir einige, dass diese gemeinsame Logik in einen dritten Dienst nach SOA-Prinzipien aufgeteilt werden sollte und von den beiden neu aufgeteilten Diensten genutzt werden sollte. Meines Erachtens wird dadurch der Vorteil der Aufteilung des großen Dienstes teilweise wieder zunichte gemacht: Wir haben einen Leistungsengpass und einen Single Point of Failure eingeführt. Wenn der Host-Prozess des dritten Dienstes ausfällt, können 1 und 2 ihre Arbeit nicht mehr verrichten. Das passiert bei uns jetzt, wo wir eine "tiefe" Struktur mit vielen Diensten haben. Wenn ein Dienst ausfällt, kommt es zu einer Zeitüberschreitung bei allen abhängigen Diensten in der Kette, da ihre Anrufe nicht beantwortet werden.
Wenn die gemeinsame Logik nur eine Bibliothek und kein Dienst wäre, hätten wir den Vorteil der Wiederverwendung von Code, keinen Leistungsengpass und eine Fehlerisolierung, da jeder Dienst seine eigene Kopie der Baugruppe in seinem eigenen Speicher ausführt. Außerdem gibt es keinen Serialisierungs-Overhead.
Was denken die Leute darüber? Gibt es eine Regel oder einen allgemeinen Leitfaden, wenn es darum geht, zu entscheiden, wann etwas eine Dienstleistung oder eine Bibliothek sein sollte? Irgendwelche anderen Ratschläge?
Danke Michael