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?