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.
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:
- Implementieren Sie echte Transaktionen mit WS-Atomic Transaction oder ähnlichem
- 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?
quelle
Antworten:
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.
quelle
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:
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.
quelle
Nein, das ist ein Mythos. Dies ist eine falsche Absicht beim Entwerfen der Dienstarchitektur. Es gibt eine ganze Reihe von Problemen:
Es gibt noch mehr falsche Ansätze für die Annäherung an die Dienstarchitektur . Also sei vorsichtig.
quelle