Micro-Services und Datenreplikation

14

Ich erstelle eine neue Anwendung und habe über die Architektur von Mikrodiensten gelesen. Die Architektur selbst ist aus Sicht der Entwicklung, Bereitstellung und des Lebenszyklusmanagements sehr sinnvoll. Es stellte sich jedoch die Frage, wie mit Stammdaten umgegangen werden soll.

Zum Beispiel habe ich 2 Apps - sagen wir Sales App und eine Ticketing App. Angenommen, beide Apps sind als eigene Mikrodienste erstellt. Wenn diese beiden Apps bereitgestellt werden (vorausgesetzt, sie werden separat bereitgestellt, dh Sales verwendet MongoDB und Ticketing verwendet MariaDB), müssen sie jedoch Zugriff auf dieselben Stammdateninstanzen haben, z. B. Accounts, Products. Dies würde bedeuten, dass es eine Eigentümer-App für eine bestimmte Stammdatenentität (z. B. für Konten, bei der es sich möglicherweise um die Verkaufs-App handelt) und eine interessierte Partei (z. B. für die Ticketing-App müssen Informationen zu Konten vorliegen) gibt.

Dies kann auf verschiedene Arten erreicht werden: - Datenreplikation vom Master zum Interessenten - Synchrones Lesen vom Interessenten zum Master (Synchronisierungsabhängigkeit wird vom Modell der Mikrodienstarchitektur nicht empfohlen) - Eigenes zentralisiertes Repository

Auch innerhalb von Accounts kann es einen Kernteil geben, der sowohl für den Verkauf als auch für das Ticketing gilt (z. B. Kontoname, Adresse usw.). Einige Aspekte des Kontos sind möglicherweise NUR für den Verkauf und andere NUR für das Ticketing relevant.

Irgendwelche Gedanken / Best Practices / Meinungen zu einer der oben genannten Optionen?

Mithrandir
quelle
Könnten Sie nicht auch Konten und Produkte als Mikrodienste erstellen? Entkoppeln Sie diese vollständig von einer "Stammdatenentität". Der Vertrieb würde nur über den Verkauf einer Entität Bescheid wissen, muss jedoch nicht wissen, ob es sich bei der Entität um ein Produkt, eine Dienstleistung oder eine andere Entität handelt, die Sie möglicherweise später hinzufügen möchten.
bleakgadfly
Ja das wäre möglich. Auch hier besteht die Herausforderung darin, dass der zentrale "Account" -Dienst übergeordnet modelliert werden muss (dh, er sollte Attribute für Vertrieb, Ticketing usw. berücksichtigen). Dies würde gegen das SRP-Paradigma verstoßen.
Mithrandir

Antworten:

12

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.

Perfektionist
quelle
Verwenden Sie eine eigene Lösung oder etwas anderes?
FrEaKmAn
2
Wir haben NServiceBus verwendet, mit dem Ideen / Strukturen für die Bewältigung der Workflows in den einzelnen Diensten vorgestellt werden. Persistenz kann durch RavenDB auftreten. Möglicherweise möchten Sie eine Technologie nicht zu früh auswählen - Ihre Umstände können sich unterscheiden und wir hatten Probleme beim Zahnen. Martin Fowler hat einige wirklich gute Ratschläge für Leute, die mit Microservices anfangen : martinfowler.com/articles/microservices.html - "... Sie sollten nicht mit einer Microservices-Architektur beginnen. Beginnen Sie stattdessen mit einem Monolithen, lassen Sie ihn modular und teilen Sie ihn es in Microservices, sobald der Monolith ein Problem wird. "
Perfektionist
In Short „ Die beste Lösung war , dass wir hatten eine erhebliche Doppelarbeit und Denormalisation unserer Daten Micro Dienste ihre eigenen Kopien von Daten erhalten sie über betreut..
DeFreitas
2

Gemeinsame Datenspeicherung würde gegen die Microservice-Architektur verstoßen. Der Punkt ist, wenn es Konten gibt, sollte es einen Dienst geben, der sie verwaltet, und es sollte keine andere Möglichkeit geben, mit diesen Konten zu interagieren, als den Dienst gründlich zu durchlaufen. Ihre Microservices wären nicht unabhängig, wenn sie gemeinsamen Speicher hätten und Änderungen am Speichermechanismus, der Validierung oder andere Einschränkungen in beiden Services implementiert werden müssten. In der Praxis passiert dies nie und führt bald dazu, dass beide Anwendungen vor ernsthaften Änderungen bewahrt werden.

Verwenden Sie daher einen Dienst als einzige Möglichkeit, auf Ihre Daten zuzugreifen, z. B. Konten. Es kann vorkommen, dass für die Implementierung einer Funktion in einem anderen Dienst eine Änderung des Kontodienstes erforderlich ist. Dies ist in Ordnung. Denken Sie daran, dass die für einen Dienst spezifische Logik in diesem Dienst enthalten sein sollte und dass so wenig spezifisches Material wie möglich in den Microservice "Accounts" aufgenommen werden sollte.

Michał Kosmulski
quelle
0

müssen Zugriff auf dieselben Stammdateninstanzen haben, z. B. Konten, Produkte

Nicht das gleiche. Jeder Mikrodienst sollte eine eigene Zuordnung für Konten, Produkte usw. vornehmen. Wir gehen davon aus, dass jeder Mikrodienst eine andere Arbeitsweise mit den Entitäten hat.

In Domain Driven Design ist dies häufig der Fall, wenn jeder begrenzte Kontext (in derselben App!) Dieselbe Entität auf unterschiedliche Weise abbilden kann.

Wenn Sie weitere Informationen benötigen, empfehle ich das Buch Erstellen von Microservices: Entwerfen feinkörniger Systeme

Dherik
quelle
0

Haben Sie das Konzept von Gerüstaufzeichnungen auf der Grundlage eines Master-Sets in Betracht gezogen?

Beispielsweise verwaltet ein Mikrodienst Konten und der andere Produkte. Ein Dritter kann für seinen domänenspezifischen Zweck Aufzeichnungen von beiden aufbewahren.

Robert Christian
quelle