Es ist möglich, eine gemeinsam genutzte Datenbank für mehrere Mikrodienste zu verwenden. Die Muster für die Datenverwaltung von Microservices finden Sie unter folgendem Link: http://microservices.io/patterns/data/database-per-service.html . Übrigens ist es ein sehr nützlicher Blog für die Microservices-Architektur.
In Ihrem Fall bevorzugen Sie die Verwendung der Datenbank pro Dienstmuster. Dies macht Microservices autonomer. In dieser Situation sollten Sie einige Ihrer Daten auf mehrere Microservices duplizieren. Sie können die Daten für API-Aufrufe zwischen Microservices oder für asynchrone Nachrichten freigeben. Dies hängt von Ihrer Infrastruktur und der Häufigkeit von Datenänderungen ab. Wenn es sich nicht oft ändert, sollten Sie die Daten mit asynchronen Ereignissen duplizieren.
In Ihrem Beispiel kann der Lieferservice Lieferorte und Produktinformationen duplizieren. Der Produktservice verwaltet die Produkte und Standorte. Anschließend werden die erforderlichen Daten mit asynchronen Nachrichten in die Datenbank des Zustelldienstes kopiert (Sie können beispielsweise rabbit mq oder apache kafka verwenden). Der Lieferservice ändert die Produkt- und Standortdaten nicht, verwendet sie jedoch bei der Ausführung seiner Arbeit. Wenn sich der Teil der Produktdaten, der vom Lieferservice verwendet wird, häufig ändert, ist die Duplizierung von Daten mit asynchronem Messaging sehr kostspielig. In diesem Fall sollten Sie API-Anrufe zwischen Produkt und Lieferservice tätigen. Der Lieferservice fordert den Produktservice auf, zu prüfen, ob ein Produkt an einen bestimmten Ort geliefert werden kann oder nicht. Der Lieferservice fragt den Produktservice nach einer Kennung (Name, ID usw.) eines Produkts und eines Standorts. Diese Kennungen können vom Endbenutzer übernommen oder von Microservices gemeinsam genutzt werden. Da die Datenbanken von Microservices hier unterschiedlich sind, können wir keine Fremdschlüssel zwischen den Daten dieser Microservices definieren.
API-Aufrufe sind möglicherweise einfacher zu implementieren, aber die Netzwerkkosten sind bei dieser Option höher. Außerdem sind Ihre Dienste weniger autonom, wenn Sie API-Anrufe tätigen. In Ihrem Beispiel kann der Lieferservice seine Aufgabe nicht erfüllen, wenn der Produktservice nicht verfügbar ist. Wenn Sie die Daten mit asynchronem Messaging duplizieren, befinden sich die für die Zustellung erforderlichen Daten in der Datenbank von Delivery Microservice. Wenn der Produktservice nicht funktioniert, können Sie die Lieferung ausführen.
Wenn Sie Ihren Code verteilen, um eine geringere Kopplung zu erreichen, möchten Sie die gemeinsame Nutzung von Ressourcen vermeiden, und Daten sind eine Ressource, die Sie nicht gemeinsam nutzen möchten.
Ein weiterer Punkt ist, dass nur eine Komponente in Ihrem System die Daten besitzt (für Statusänderungsvorgänge), andere Komponenten LESEN, aber NICHT SCHREIBEN können, Kopien der Daten haben können oder Sie ein Ansichtsmodell freigeben können, mit dem sie den neuesten Status abrufen können eines Objekts.
Durch die Einführung der referenziellen Integrität wird die Kopplung wieder eingeführt. Stattdessen möchten Sie für Ihre Primärschlüssel so etwas wie Guids verwenden. Diese werden vom Ersteller des Objekts erstellt. Der Rest dreht sich um die Verwaltung der eventuellen Konsistenz.
Weitere Informationen finden Sie in Udi Dahans Vortrag im NDC Oslo
Hoffe das hilft
quelle
Ein 2020-Update für diese Antwort besteht darin, ein Tool zur Datenerfassung wie Debezium zu verwenden. Debezium überwacht Ihre Datenbanktabellen auf Änderungen und überträgt sie an Kafka / Pulsar (andere Pipes). Ihre Abonnenten können die Änderungen dann erfassen und synchronisieren.
quelle