Ausgehend von dem, was ich über eventuelle Konsistenz verstanden habe, erhalten alle diese Dienste (Verbraucher) das Ereignis gleichzeitig und verarbeiten sie separat, was in einem guten Szenario zu einer Konsistenz der Daten führt.
Nein, nicht unbedingt. Wie ich bereits sagte, können wir eine gesendete E-Mail nicht rückgängig machen, daher benötigen wir immer noch eine Art "Sequenz". IPC über ereignisgesteuertes Datenmanagement ist nicht von Orchestation 1 ausgenommen .
Beispielsweise sollte die E-Mail erst gesendet werden, wenn die vorherigen Transaktionen erfolgreich abgeschlossen wurden und der E-Mail-Dienst einen Beweis dafür erhält. 3
Was ist jedoch, wenn ein Dienst das Ereignis nicht verarbeiten kann? zB plötzliche Trennung, Datenbankfehler usw. Was ist eine gute Vorgehensweise, um diese Transaktionsfehler zu behandeln?
Begrüßen Sie die Irrtümer des Distributed Computing . Sie machen die Dinge kompliziert, und es gibt, wie üblich, keine Silberkugeln, die sich mit ihnen auseinandersetzen könnten.
Bevor wir uns auf die Suche nach der Verlorenen Arche machen, müssen wir zunächst die Organisation fragen. Oft liegt die Lösung darin, wie die Organisation diesen Problemen in der realen Welt begegnet .
Was machen alle (Abteilungen), wenn bestimmte Daten fehlen oder unvollständig sind?
Wir werden feststellen, dass verschiedene Abteilungen unterschiedliche Lösungen haben, die zusammen die zu implementierende Lösung darstellen.
Wie auch immer, hier einige Übungen, die uns bei der Strategie helfen könnten, zu folgen.
Anstatt sicherzustellen, dass das System ständig in einem konsistenten Zustand ist, können wir stattdessen akzeptieren, dass das System es irgendwann in der Zukunft erhalten wird. Dieser Ansatz ist besonders nützlich für langlebige Geschäftsvorgänge.
Die Art und Weise, wie das System die Konsistenz erreicht, ist von System zu System unterschiedlich. Dies kann von automatisierten Prozessen bis zu Eingriffen durch den Menschen reichen. Zum Beispiel der typische Versuch, es später noch einmal zu versuchen, oder der Kontakt mit dem Kundendienst .
Alle Operationen abbrechen
Versetzen Sie das System durch Ausgleichstransaktionen wieder in einen konsistenten Zustand . Wir müssen jedoch berücksichtigen, dass auch diese Transaktionen fehlschlagen können, was uns zu einem Punkt führen könnte, an dem es noch schwieriger ist, die Inkonsistenz zu lösen. Auch hier können wir eine gesendete E-Mail nicht rückgängig machen.
Bei einer geringen Anzahl von Transaktionen ist dieser Ansatz durchführbar, da auch die Anzahl der Kompensationstransaktionen gering ist. Wenn mehrere Geschäftstransaktionen am IPC beteiligt wären, wäre die Abwicklung einer Ausgleichstransaktion für jede dieser Transaktionen eine Herausforderung.
Wenn wir Transaktionen kompensieren wollen , werden wir feststellen , dass das Leistungsschalter-Entwurfsmuster sehr nützlich ist - und obligatorisch, würde ich sagen -
Verteilte Transaktionen
Die Idee ist, mehrere Transaktionen innerhalb einer einzigen Transaktion über einen als Transaction Manager bezeichneten übergreifenden Steuerungsprozess zu erfassen . Ein üblicher Algorithmus für die Verarbeitung verteilter Transaktionen ist das Zwei-Phasen-Festschreiben .
Das Hauptanliegen der verteilten Transaktionen ist, dass sie die Ressourcen während ihrer Lebensdauer sperren müssen, und wie wir wissen, können auch beim Transaction Manager Probleme auftreten.
Wenn der Transaktionsmanager kompromittiert wird, kann dies zu mehreren Sperren in den verschiedenen begrenzten Kontexten führen, was zu unerwartetem Verhalten aufgrund der Einreihung der Nachrichten führt. 2
Zerlegen von Operationen. Warum?
Wenn Sie ein vorhandenes System zerlegen und eine Sammlung von Konzepten finden, die wirklich innerhalb einer einzigen Transaktionsgrenze liegen sollen, lassen Sie diese möglicherweise bis zum letzten Mal bestehen.
Sam Newman
In Übereinstimmung mit den obigen Argumenten hat Sam-in seinem Buch Building Microservices - festgestellt, dass wir es vermeiden sollten, die Operation jetzt aufzuteilen, wenn wir uns die letztendliche Konsistenz wirklich nicht leisten können.
Wenn wir es uns nicht leisten können, bestimmte Vorgänge in zwei oder mehr Transaktionen aufzuteilen, kann es sein, dass diese Transaktionen wahrscheinlich zum selben begrenzten Kontext oder zumindest zu einem übergreifenden Kontext gehören, der modelliert werden muss.
In unserem Fall stellen wir zum Beispiel fest, dass die Transaktionen Nr. 1 und Nr. 2 eng miteinander verbunden sind und wahrscheinlich beide demselben begrenzten Kontext angehören können: Konten , Benutzer , Registrieren , was auch immer ...
Ziehen Sie in Betracht, beide Operationen innerhalb der Grenzen derselben Transaktion zu platzieren. Dies würde die Handhabung der gesamten Operation erleichtern. Gewichtung der Kritikalität jeder Transaktion. Wenn Transaktion 2 fehlschlägt, sollte dies wahrscheinlich nicht den gesamten Vorgang beeinträchtigen. Im Zweifelsfall wenden Sie sich an die Organisation .
1: Nicht die Art von Orchestrierung, die Sie denken. Ich spreche nicht von ESB Orchestation. Ich spreche davon, die Dienste auf das richtige Ereignis reagieren zu lassen.
2: Vielleicht finden Sie interessante Meinungen von Sam Newman zu verteilten Transaktionen.
3: Sehen Sie sich die Antwort von David Parker zu diesem Thema an.