Der Ort, an dem ich arbeite, versucht, einige Grundregeln zu etablieren, und die Debatte, die wir derzeit führen, sind lokale Bibliotheken und Webservices zur Wiederverwendung von Code. Web-Services scheinen in den meisten Unternehmen die beliebteste Wahl zu sein, und genau darauf tendieren die meisten Entwickler hier.
Ich kann einfach nicht erkennen, wie Sie Webdienste für eine ernsthafte Arbeit effektiv nutzen können. Wie kann ich mehrere Serviceabrufe sicher ausführen, wenn ich keine Transaktion verwenden kann?
Angenommen, ich habe einen Cron-Job, der Kunden aus unserer Datenbank abruft, die eine bestimmte Bedingung erfüllen, über die sie benachrichtigt werden müssen. Sie erhalten ein Fax, eine E-Mail und ein Ticket, um das Problem intern zu verfolgen. Das sind 3 verschiedene Serviceaufrufe, die für jeden Kunden in einer for-Schleife stattfinden würden.
Wenn dort irgendwo ein Fehler auftritt, wird möglicherweise ein Fax und eine E-Mail an den Kunden gesendet, aber kein Ticket erstellt. Oder schlimmer noch, dieser Cron-Job kann einen Fehler enthalten, der dazu führt, dass er jedes Mal zum gleichen Zeitpunkt fehlschlägt und denselben Kunden wiederholt per E-Mail benachrichtigt. Wenn die Bibliotheken alle lokal wären, könnte alles einfach in eine Transaktion eingebunden werden, und all das würde nicht passieren. In diesem Beispiel verwenden wir jedoch Webdienste.
Beachten Sie, dass die E-Mail- und Faxmethoden die Daten tatsächlich in datenbankgestützte Warteschlangentabellen einfügen, die wiederum von einem separaten Cron-Job-Prozess verarbeitet werden. So können die Aufrufe der Dienstmethoden "E-Mail senden" und "Fax senden" bei Bedarf nebenwirkungsfrei abgebrochen werden.
Eine Option besteht darin, diesen gesamten Codebaustein in den Webdienst selbst einzufügen, sodass der Webdienst selbst die Methoden zum Erstellen von E-Mails, Faxen und Tickets in einer Transaktion aufruft. Aber dann erstellen wir eine Webservice-Methode nur für die Verwendung einer Transaktion. Es gibt keinen gültigen Grund, warum wir diese Methode jemals von irgendwo anders als in diesem einen Cron-Skript aufrufen müssten.
Wie würden Sie generell mit dieser Methode umgehen?
quelle
Antworten:
Was Sie beschreiben, ist eine verteilte Transaktion , die ein zweiphasiges Commit implementiert . Einige Messaging-Plattformen für Unternehmen umfassen Transaktionsmanager, die solche Funktionen unterstützen. Konkrete Produkte sind jedoch plattform- / sprachabhängig. Ich habe keine konkreten Erfahrungen mit solchen Tools, hoffe aber, dass diese Hinweise helfen.
quelle
Es ist interessant, dass die DDD / CQRS-Mailingliste, an der ich teilnehme, einen ähnlichen Thread zu Diensten enthält, die mehrere Plattformen unterstützen. Ich kann hier einige meiner Ratschläge wiederholen.
Eine Option für die Unterstützung von Transaktionen in einer heterogenen Umgebung ist die Verwendung eines Transportmechanismus, der Transaktionen unterstützt und auf allen Plattformen unterstützt wird, auf denen er verwendet wird. Das Advanced Message Queue Protocol (AMQP) unterstützt Transaktionen und es gibt eine native API für fast jede Sprache, die heute allgemein verwendet wird. RabbitMQ ist ein Server, der AMQP implementiert und in der Branche als robuste Lösung geprüft wurde.
Wenn Sie ein RabbitMQ-basiertes System einsetzen, sind Sie auf dem Weg zu einem vollständigen ESB, falls Sie daran wachsen müssen. Sie veröffentlichen Nachrichten in einem Kanal und abonnieren eine Warteschlange. Was wirklich mächtig wird, ist, dass Sie zwischen dem Kanal und der Warteschlange viele interessante Dinge ausführen können. Ein Kanal kann mehrere Warteschlangen (Pub / Sub) versorgen. Eine Warteschlange kann von mehreren Kanälen gespeist werden. Sie können Nachrichten an verschiedene Warteschlangen weiterleiten, basierend auf dem Inhalt usw. usw.
Ich habe gerade über Alternativen zu Transaktionen gelesen (die mit Overhead verbunden sind und eine asynchrone Operation in eine blockierende Operation verwandeln). RabbitMQ unterstützt sogenannte Publisher Confirms . Grundsätzlich können Sie einen Rückruf für eine veröffentlichte Methode registrieren, um eine fehlgeschlagene Transaktion zu verarbeiten. In Ihrem Fall könnten die E-Mail- / Faxanfragen rückgängig gemacht und das Ticket gelöscht werden.
Natürlich geht das Kaninchenloch (verzeihen Sie das Wortspiel) von dort aus noch tiefer. Mit Rabbit können Sie komplexe Orchestrierungen mit internen und externen Webdiensten durchführen.
Für Ihre öffentlich zugänglichen Webservices ist dies denkbar einfach. Ihr Service (sei es SOAP, REST oder JSON) veröffentlicht lediglich eine Nachricht an die entsprechende Servicewarteschlange und lässt sie von dort aus von Ihrem internen System verarbeiten.
Es gibt auch Funktionen zum Erstellen einer Anforderungs- / Antwortnachricht für die Szenarien, in denen Sie Informationen schnell wieder erwarten.
quelle
Die Schlüsselwörter, nach denen Sie suchen, sind "Webservice-Choreografie".
Lesen Sie den Wikipedia -Artikel darüber.
quelle
Die Art und Weise, wie ich dies in einer von mir geschriebenen Service-App handhabte, bestand darin, einen Wrapper für die erforderlichen Transaktionen zu erstellen. In meinem Fall musste die Benutzeranforderung, die von einer Website, einer Desktop-App oder einem Windows-Dienst gestellt wurde, einen Webdienst abfragen und basierend auf dem Ergebnis und den Benutzeroptionen eine lokale Datenbank und optional eine entfernte Datenbank aktualisieren über einen Webservice. Anschließend musste ein Bericht erstellt werden, der sofort per E-Mail und / oder Fax zurückgesandt werden konnte. Ich hatte die Kontrolle über die lokale Datenbank-, E-Mail- und Berichterstellung, jedoch keine über die Webservices oder den Faxserver.
Das Erstellen eines Wrappers ermöglichte eine bessere Transaktionskontrolle und Fehlerbehandlung. Es ermöglichte auch eine bessere Sicherheit, indem der Zugriff auf interne Netzwerkdienste von externen Quellen gesteuert wurde. Im Allgemeinen sehe ich die Notwendigkeit von Transaktionen und die Verwaltung des Dienstes als gültigen Grund, einen geeigneten Wrapper für eine einzelne Lösung zu erstellen, solange der Code ordnungsgemäß wiederverwendet wird (keine Codierung durch Ausschneiden und Einfügen).
quelle
Das kannst du nicht.
Die Frage, die Sie sich stellen sollten, lautet: Wie implementiere ich Transaktionen mit dem Web-Service-Framework X? Im Moment nehmen Sie nur an, dass es unmöglich ist.
quelle