it-swarm.com.de

Microservices: Umgang mit Fremdschlüsselbeziehungen

Die Microservices-Architektur schlägt vor, dass jeder Dienst seine eigenen Daten verarbeiten sollte. Daher sollte jeder Dienst (Dienst A), der von Daten abhängig ist, die einem anderen Dienst (Dienst B) gehören, auf diese Daten zugreifen, und zwar nicht durch direkte DB-Aufrufe, sondern über die vom zweiten Dienst (Dienst B) bereitgestellte API.

Was empfehlen die Best Practices von microservices zur Überprüfung von Fremdschlüsseleinschränkungen?

Beispiel: Ich entwickle eine Lieferfunktion (Microservice 1) für Produkte, und bestimmte Produkte können nur an bestimmte Standorte geliefert werden, wie in der Produkttabelle angegeben, auf die nur der Microservice für Produkte zugreifen kann (Microservice 2).

Wie stelle ich sicher, dass Microservice 1 (d. H. Liefermöglichkeit) eine Bestellung nicht an einen nicht gewarteten Ort weiterleitet? Ich habe diese Frage, weil die Lieferfunktion nicht direkt auf die Produktdatenbank zugreifen kann. Daher gelten auf DB-Ebene keine Einschränkungen, wenn ein Lieferauftrag in der Lieferdatenbank abgelegt wird oder Tisch).

50
user8205906

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 unter mehreren Microservices duplizieren. Sie können die Daten für API-Aufrufe zwischen Microservices oder für asynchrone Nachrichtenübertragung freigeben. Dies hängt von Ihrer Infrastruktur und der Häufigkeit der 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. Product Service verwalten die Produkte und Standorte. Anschließend werden die erforderlichen Daten mit asynchronen Nachrichten in die Datenbank des Zustelldienstes kopiert (z. B. können Sie rabbit mq oder Apache kafka verwenden). Der Lieferservice ändert die Produkt- und Standortdaten nicht, verwendet sie jedoch, wenn er seine Arbeit erledigt. Wenn sich der Teil der Produktdaten, der vom Lieferservice verwendet wird, häufig ändert, ist das Duplizieren von Daten mit asynchronem Messaging sehr kostspielig. In diesem Fall sollten Sie API-Anrufe zwischen Produkt und Lieferservice tätigen. Der Lieferservice fragt den Produktservice, 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. Denn in Ihrem Beispiel, wenn der Produktservice nicht verfügbar ist, kann der Lieferservice seinen Job nicht ausführen. Wenn Sie die Daten mit Async 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.

39
Ali Sağlam

Wenn Sie Ihren Code verteilen, um eine verringerte 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 können die Daten lesen, aber nicht schreiben, sie können Kopien der Daten haben oder Sie können ein Ansichtsmodell gemeinsam nutzen, mit dem sie den neuesten Status abrufen können eines Objekts.

Wenn Sie die referenzielle Integrität einführen, wird die Kopplung wieder hergestellt. Stattdessen möchten Sie Guids für Ihre Primärschlüssel verwenden. Diese werden vom Ersteller des Objekts erstellt. Im Rest geht es darum, die eventuelle Konsistenz zu verwalten.

Werfen Sie einen Blick auf Udi Dahans Vortrag im NDC Oslo für weitere Details

Hoffe das hilft

14
Sean Farmar