4 Stimmen

SOA: Bibliotheken vs. Dienste: Kann eine Bibliothek eine bessere Option sein?

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

4voto

Kirk Broadhurst Punkte 26286

Dies ist ein gutes Argument gegen die Verwendung von Diensten, aber der richtige Ansatz ist wahrscheinlich die Verwendung eines Dienstbusses.

Sie können dann mehrere Dienste betreiben, um Ihre "Kern"-Funktionalität zu erfüllen. Sie erhalten Redundanz und Zuverlässigkeit (Sie könnten sogar Ihre Prozesse 1 und 2 an getrennte Instanzen weiterleiten, wenn Sie dies benötigen, aber einen Lastausgleich bevorzugen), aber Sie erhalten die lose Kopplung und Wartbarkeit getrennter Dienste.

Ich glaube, dass SOA ein großartiges Prinzip ist, aber es erfordert eine sehr sorgfältige Architektur und ist sehr leicht falsch zu machen. Und wenn man es falsch macht, kann das schlimme Folgen haben.

2voto

Phil Degenhardt Punkte 7158

Bei der Abwägung, ob eine Bibliothek oder ein Dienst der bessere Ansatz für ein bestimmtes Problem ist, gibt es für mich wahrscheinlich zwei wesentliche Überlegungen.

Zunächst zu den potenziellen Verbrauchern: Wenn sie vollständig unter Ihrer Kontrolle stehen und es möglich ist, sie prozessintern zu hosten, wäre eine Bibliothek ein legitimer Ansatz. Wenn es keine Möglichkeit der externen Nutzung gibt, ist dies wahrscheinlich die bessere Wahl, da der Aufwand für Design, Entwicklung und Tests wahrscheinlich wesentlich geringer ist als bei einem entsprechenden Dienst.

Der zweite Punkt ist die "Großzügigkeit" der API. Dienste müssen so konzipiert sein, dass sie weniger "geschwätzig" sind - ein guter Dienst verfügt in der Regel über leistungsfähige Operationen, deren Verhalten sich an den Inhalt der Nachricht anpasst. Z.B. Addorder(msg) vs. CreateHeader(h), GetCustomer(c), AddOrderCustomer(h,c), AddOrderLine(p,1), etc. Ersteres würde ich von einer Dienstoperation erwarten, während letzteres eher typisch für eine Bibliothek wäre. Wenn sich das Problem nicht für diese Art von API eignet oder Sie nicht den nötigen Aufwand betreiben können, um das Design richtig hinzubekommen, dann wäre eine Bibliothek angemessener.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X