it-swarm.com.de

Microservices mit gemeinsam genutzter Datenbank? Verwenden Sie mehrere ORMs?

Ich lerne etwas über Microservices und baue ein Projekt mit einer Microservices-Architektur auf.

Die Sache ist, einer meiner Teamkollegen möchte eine Datenbank für alle Services verwenden und alle Tabellen gemeinsam nutzen, damit "Daten nicht wiederholt werden". Jeder Service würde mit unterschiedlichen Frameworks und Sprachen wie Django und erstellt Rails, die sehr unterschiedliche ORM-Standards verwenden.

Was wäre der richtige Ansatz? Da ich denke, dass das Arbeiten mit einer Datenbank viel "Hacken" der ORMs mit sich bringen würde, damit sie korrekt funktionieren.

28
Eduardo Veras

Es ist unwahrscheinlich, dass Sie von einer Microservices-Architektur profitieren, wenn alle Dienste dieselben Datenbanktabellen verwenden. Dies liegt daran, dass Sie die Dienste effektiv eng koppeln. Wenn sich eine Datenbanktabelle ändert, müssen sich alle Dienste ändern.

Sie müssen verstehen, dass der Hauptgrund für eine Microservices-Architektur darin besteht, die Abhängigkeiten zwischen Entwicklungsteams zu verringern und es ihnen zu ermöglichen, mit schnellen Releases unabhängig voranzukommen.

Hier ist ein Zitat von Werner Vogels, dem Amazon CTO (Amazon war ein Pionier der Microservices-Architektur):

Serviceorientierung bedeutet für uns, die Daten mit der Geschäftslogik zu kapseln, die mit den Daten arbeitet, wobei der einzige Zugriff über eine veröffentlichte Serviceschnittstelle erfolgt. Es ist kein direkter Datenbankzugriff von außerhalb des Dienstes zulässig und es findet kein Datenaustausch zwischen den Diensten statt.

Weitere Informationen finden Sie unter this und this .

46

Im Allgemeinen sollte ein Microservice für seine eigenen Daten verantwortlich sein. Das ist ein perfektes Weltszenario.

In der Praxis können einige der Dienste in hohem Maße miteinander verbunden sein. Z.B. CustomerShippingDetails und CustomerShoppingCheckout greifen möglicherweise beide auf dieselben Daten zu - Kundenadresse. Wie würden Sie dann das Problem der Bereitstellung der Kundenadresse für den Kunden-Checkout-Service lösen? Wenn der Checkout-Service die Einkaufsdetails direkt abfragt, lösen Sie die Kopplung zwischen den Services. Eine andere Möglichkeit ist die Einführung einer gemeinsam genutzten Datenbank.

Bei der Architektur wird es immer Kompromisse geben müssen. Was geopfert wird, ist eine architektonische Entscheidung, die stark vom Gesamtbild (dem Design des gesamten Systems) abhängt.

Da ich nicht zu viele Details über Ihr System habe, würde ich einen gemischten Ansatz wählen. Das heißt, eine gemeinsam genutzte Datenbank für Dienste, die ähnliche Geschäftslogik berücksichtigen. So können CustomerShippingDetails und CustomerShoppingCheckout eine Datenbank gemeinsam nutzen. Ein StoreItemsDetails-Objekt verfügt jedoch über eine separate Datenbank.

Weitere Informationen zum freigegebenen Datenbankmuster für Microservices finden Sie unter Microservice Architecture .

8
PiotrWolkowski