Funktioniert die SOA-Servicezusammensetzung tatsächlich in der Praxis?

15

Eines der Hauptprinzipien für das SOA-Service-Design ist das Service-Composability-Prinzip ( https://en.wikipedia.org/wiki/Service_composability_principle ).

Die Idee ist, dass durch das Zusammenstellen neuer Dienste unter Verwendung vorhandener Dienste als Bausteine ​​schnell neue Dienste entwickelt werden können. Analog dazu, wie Sie vorhandene Methoden von Objekten aufrufen, wenn Sie neue Methoden implementieren. Hier soll ein Großteil der Produktivitätssteigerung durch SOA herbeigeführt werden.

Bildbeschreibung hier eingeben

Tut das wirklich jemand in der Praxis? Ich habe dies endlos in schriftlichen Texten wiederholt gesehen, aber selbst keine praktischen Implementierungen erlebt. Im größten Teil des Textes wird auch die Transaktionsabwicklung nicht erwähnt , was meines Erachtens das größte Hindernis bei der Realisierung komponierbarer Dienste darstellt.

Zunächst müssen Sie das Transaktionsproblem wirklich lösen, bevor Sie nicht-triviale Services erstellen können. Sicher, wenn das Beispiel die Dienste "findCurrentTime ()" und "writeLogMessage ()" hat, ist es einfach, sich keine Gedanken über Transaktionen zu machen, aber nicht, wenn es Beispiele aus der Praxis wie "depositMoney ()" und "drawMoney () "gibt.

Ich kenne zwei Möglichkeiten:

  1. Implementieren Sie echte Transaktionen mit WS-Atomic Transaction oder ähnlichem
  2. Implementieren Sie eine kompensationsbasierte Lösung, die den Anruf an A mit "cancelA ()" oder so etwas ausgleicht, wenn der Anruf an B fehlschlägt

Beides erscheint mir sehr problematisch / beinahe unbrauchbar:

  • WS-Atomic-Transaktion
    • eine Menge von Komplexität, die meisten Ratschläge , die ich gerade warnt gefunden „Nervensäge, tun sie nicht tun es“
    • Die Unterstützung ist begrenzt, z. B. wenn Sie Open-Source-ESBs verwenden, wird sie von den Hauptalternativen ServiceMix, Mule oder WSO2 nicht unterstützt
  • Entschädigungen
    • die umsetzung des umgangs mit entschädigungen erscheint mir sehr komplex. Was tun wir, wenn Service A erfolgreich ist und wir keine Antwort von Service B erhalten und nicht wissen, ob er fehlgeschlagen oder erfolgreich war? Wenn ich eine solche Logik manuell handhabe (als Implementierer von Compositing-Diensten), möchte ich meine Handgelenke aufschneiden - das ist die Art von Arbeit, die ein Tool für mich erledigen sollte !.
    • Ich verstehe auch nicht, wie man in nicht trivialen Diensten Vergütungsmethoden einsetzen kann. Angenommen, Ihr Service A ist "depositMoney ()" und das gelingt, eine andere Aktion überweist das Geld schnell an einen anderen Ort und dann erhalten wir "compensateDepositMoney ()". Was machen wir jetzt? Scheint wie eine große Dose Würmer.

Mir scheint, dass die Zusammensetzung von Diensten ein so grundlegendes SOA-Prinzip ist, dass Sie die Vorteile von SOA nicht wirklich nutzen können, wenn Sie Dienste nicht (bequem) zusammenstellen können . Was ist die Realität? 90% der SOA-Nutzer nutzen "Criplled SOA" ohne echte Servicekompensation? Oder verwenden die meisten Benutzer tatsächlich die Service-Komposition, und ich übertreibe die Schwierigkeit?

Janne Mattila
quelle
+1 Dies ist eine so große Frage, und so schade, dass es nicht viel Aufmerksamkeit hatte.
Gaz_Edge

Antworten:

0

Die kurze Antwort lautet Ja!

Ich habe dies bei mehreren großen Finanzorganisationen gesehen und es hat gut funktioniert.

Die Transaktionsprobleme sind komplex, werden jedoch normalerweise von (teurer) Middleware wie Oracles WebLogic EAI oder IBMs Websphere ESB gelöst.

James Anderson
quelle
Ich denke, ich wähle Ihre Antwort aus. Ich vermute, die Service-Komposition funktioniert, wenn Sie sich die Mühe machen und die richtigen Werkzeuge verwenden.
Janne Mattila
Als Folgefrage bin ich gespannt, wie viel Prozent der SOA-Implementierungen "richtig" ablaufen und eine echte Service-Zusammensetzung verwenden. Meine Vermutung wäre ziemlich gering, wie 10% ... irre ich mich?
Janne Mattila
4

Ja, es kann gemacht werden, um in der Praxis zu arbeiten. Es ist jedoch möglicherweise nicht der beste Ansatz und wird möglicherweise als Standardoption mehr verwendet, als es sollte. Meiner Meinung nach wurde SOA als Möglichkeit zur Integration von Altsystemen populär, da Unternehmen ihre IT weiterentwickelten, um immer größere Aufgaben zu automatisieren. Es kann sehr chaotisch sein, aber es lohnt sich möglicherweise, wenn ältere Systeme wiederverwendet werden können. Wenn Sie das Glück haben, ein Projekt auf der grünen Wiese zu starten, sollten Sie andere Ansätze in Betracht ziehen, bevor Sie davon ausgehen, dass dies der beste Weg ist.

Um einige Ihrer spezifischeren Anliegen zu beantworten ...

Sie können Transaktionen verwenden:

  1. WS-TX ist eine PITA und ich würde es vermeiden.
  2. Alle Ihre Dienste werden möglicherweise auf einem einzigen Anwendungsserver ausgeführt. In diesem Fall können Sie sie alle mit einer XA-Transaktion umfassen. Aus diesem Grund wurden Anwendungsserver erfunden.

In Anbetracht des entschädigungsbasierten Ansatzes:

Ausgleichsmaßnahmen müssen nur berücksichtigt werden, wenn ein Fehler aufgetreten ist. Verfügt das Dienstzusammenstellungs-Tool über ein Flag, das gesteuert werden kann, wenn ein Workflow-Schritt zum ersten Mal ausgeführt wird, das jedoch bei nachfolgenden Aufrufen gesetzt wird? Wie das mögliche Resend-Flag in JMS. Dann können Sie ein sogenanntes 1,5-Phasen-Commit verwenden. Dies bedeutet im Grunde, dass Sie fortfahren, wenn das Flag klar ist. Wenn das Flag jedoch gesetzt ist, rufen Sie zunächst an, um zu überprüfen, ob der Status bereits aktualisiert wurde und ein zweites Mal durchgeführt werden muss . Dies erfordert immer noch eine manuelle Fehlerbehandlung und kann, wie Sie bemerken, komplex oder sogar unmöglich sein.

In einigen Situationen spielt es keine Rolle:

Dies ist der letztendlich konsequente Ansatz. Angenommen, ein Dienst sendet eine E-Mail. Wenn die Servicekomposition fehlschlägt und neu gestartet wird, wird die E-Mail erneut gesendet. Das ist für den Empfänger etwas ärgerlich, aber er erkennt wahrscheinlich, dass es sich um ein Duplikat handelt und alles problemlos weitergehen kann.

Sie können auch ein Protokoll der gesendeten E-Mails führen und dieses zum Deaktivieren verwenden, wenn das Flag gesetzt ist, und auf diese Weise die E-Mail nur einmal senden.

Sie können asynchrones Messaging verwenden, um Transaktionen in kleinere Teile aufzuteilen:

Stellen Sie sich eine transaktionale JMS-Warteschlange vor. Ihr Service-Koordinator kann seinen Status aktualisieren und eine Nachricht in einem einzigen Tx an die Warteschlange senden. Downstream-Dienste können Nachrichten entfernen und ihren Status in einem einzigen Tx aktualisieren. Jetzt koordinieren Sie Dienste in mehreren Arbeitseinheiten, aber jede ist atomar. Wenn irgendetwas fehlschlägt und neu gestartet werden muss kein Problem.

Dies bedeutet weiterhin, dass Sie XA-Transaktionen über die Datenbank und eine JMS-Warteschlange ausführen. Dies kann jedoch unter Verwendung des letzten Ressourcengambits effizient sein, um den vollständigen Overhead von XA zu vermeiden.

Alternativ können Sie dieses Muster verwenden, jedoch mit einer Festschreibung von 1,5 für die Datenbank und das JMS. ODER Sie können JMS ohne Transaktionen ausführen, aber durch Clustering zuverlässiger machen.

Asynchrone Nachrichtenübertragung kann auch dazu beitragen, Systeme zu entkoppeln, da Hersteller und Verbraucher voneinander unabhängiger werden können, wodurch das Ausmaß der Kopplung im Gesamtsystem verringert und es flexibler wird. Diese Art der Entkopplung ist für große Organisationen mit vielen verschiedenen Diensten von größter Bedeutung.

user2800708
quelle
Gute Antwort! Mein einziger Kommentar zum letzten Abschnitt, in dem Sie über JMS und asynchrones Messaging mit Transaktionen sprechen. Ich befürchte, dass dies hier einen schlechten Eindruck von den Fähigkeiten vermittelt. Die Transaktion eines Dienstkonsumenten zum Senden der Nachricht garantiert lediglich, dass die Nachricht gesendet und in die Warteschlange gestellt wurde. Wir haben keine solchen Garantien, was der Verbraucher tun wird, geschweige denn, wenn er die Nachricht überhaupt lesen wird.
maple_shaft
Wenn Sie eine Antwort benötigen, sollte eine Nachricht mit einer Korrelations-ID zurückgesendet werden, die mit der ursprünglich gesendeten übereinstimmt. Die Service-Orchestrierung kann sicher sein, dass die Anforderung verarbeitet wurde, sobald sie die Antwort erhält.
user2800708
+1 für "Aus diesem Grund wurden Anwendungsserver erfunden." Ich habe jetzt seit Wochen mit diesem Problem zu kämpfen. Ich starte ein neues Projekt und möchte SOA verwenden - alle Services auf derselben Box zu haben, um vollständige Transaktionskonsistenz zu ermöglichen, scheint der Weg in die Zukunft zu sein - danke!
Gaz_Edge
-1

Nein, das ist ein Mythos. Dies ist eine falsche Absicht beim Entwerfen der Dienstarchitektur. Es gibt eine ganze Reihe von Problemen:

  1. Sehr dichte Kupplung. Wenn ein Dienst geändert wurde, müssen Sie das gesamte System testen.
  2. Solche Dienste sind sehr feinkörnig, daher gibt es viel interne Kommunikation.
  3. Aufgrund der Feinkörnigkeit gibt es viele Dienstleistungen. Das System wird immer schwieriger zu verstehen, die Abfragen immer schwerer zu verfolgen.
  4. Entity-Services sind schlecht gekapselt: Keine der Geschäftsregeln wird dort überprüft, diese Logik ist in operation Services. Jeder Dienst kann also jeden Entity-Dienst aufrufen und seine Daten mit einer gemeinsamen Aktualisierungsabfrage aktualisieren, die in seiner Schnittstelle vorhanden ist. Solche Art von Entitätsdiensten werden häufig als datenzentriert bezeichnet - im Gegensatz zu prozessorientierten, verhaltensorientierten Diensten.
  5. Die angeborene Art der Kommunikation zwischen diesen Diensten ist synchron. Die Chancen stehen also gut, dass als Transport http gewählt wird. Daher all seine Nachteile, über die ich später sprechen werde.

Es gibt noch mehr falsche Ansätze für die Annäherung an die Dienstarchitektur . Also sei vorsichtig.

Zapadlo
quelle
@DownVoter Stimmen Sie nicht zu? Besprechen Sie es nicht, warum sich die Mühe machen, nur abstimmen!
Zapadlo