Ich war Teil eines Teams, das erfolgreich eine Microservices-Architektur mithilfe eines Servicebusses erstellt hat.
Anfänglich glaubten wir, dass Microservices und eine ereignisgesteuerte Architektur es uns ermöglichen würden , die zugrunde liegende Ball-of-Mud-Datenbank für gemeinsame Daten zu reparieren.
Was wir gelernt haben, war, dass Microservices und eine ereignisgesteuerte Architektur es erforderlich machten, die zugrunde liegende Ball-of-Mud-Datenbank für gemeinsame Daten loszuwerden.
Ich glaube, dass es unglaublich schwierig ist, gemeinsam genutzte Daten mit Microservices zu verarbeiten - für mich ist es unglaublich schwierig. Ich empfehle , so dass keine Dienste sehen jeweils andere Daten. Wenn Sie es nicht abfragen können, können Sie nicht versehentlich eine Abhängigkeit einführen.
Wenn Sie tun , Daten austauschen, sicherlich nur ein Service kann je einen Rekord OWN; Es ist der einzige Dienst, der in den Datensatz schreibt, und alle anderen Benutzer mit denselben Daten sollten nur Lesezugriff haben.
Leider führt selbst diese kleine verwaltete Menge an Freigaben zu einer erheblichen Kopplung zwischen Ihren Diensten. Was ist, wenn ein Dienst die Daten nicht in dieser Form haben möchte? Vielleicht will es eine Aggregation. Veranlassen Sie Ihren "Eigentümer / Schreib" -Dienst, aggregierte Daten zugunsten eines anderen Dienstes zu schreiben? Ich würde nicht raten.
Was ist, wenn der Eigentümer die Daten in einer anderen Form beibehalten möchte? Dann muss jeder Leserservice aktualisiert werden. Das ist ein Alptraum für die Instandhaltung.
Die beste Lösung war eine signifikante Vervielfältigung und Denormalisierung unserer Daten. Micro Services unterhielt eigene Kopien der Daten, die sie betreuten.
Nachrichten wurden häufig mit genügend Begleitdaten veröffentlicht, um sie zu verarbeiten.
Sie könnten sich beispielsweise vorstellen, dass ein Postversanddienst Änderungen an einer Kundenadresse nachverfolgen muss, falls er etwas posten muss. Wenn Ihre Nachricht "Artikel zum Versand bereit" jedoch die Zieladresse als Teil der Nachrichtendaten enthält, muss der Versanddienst die sich ändernden Adressen in Bezug auf Kunden überhaupt nicht mehr nachverfolgen. Nur Adressen zu bestimmten Zeitpunkten, die sich auf Artikel beziehen, wenn diese versendet werden.
Ich kann nicht vorschlagen, wie man Lösungen mit synchronisierten Daten erstellt. Unsere Datenlösungen basieren auf der Idee der "eventuellen Konsistenz".
Wenn ein Kunde seine Adresse aktualisiert, verarbeitet der Adressdienst den anfänglichen Befehl von der Benutzeroberfläche. Sobald ihre Daten korrekt sind, veröffentlicht sie eine Veranstaltung, um alle anderen interessierten Dienste über "Kundenadresse aktualisiert" zu informieren - mit der vollständigen Adresse als Daten. Diese Dienste aktualisieren ihre eigenen Datenspeicher mit den Teilen der Daten, die ihnen wichtig sind.
Die Idee ist, dass ein Dienst jedes Mal, wenn er eine wichtige Aktion ausführen muss, eine Kopie der Informationen haben sollte, die aktuell genug ist, um korrekt zu handeln, entweder unabhängig nachverfolgt oder als Teil der Nachricht, auf die er antwortet.