it-swarm.com.de

Microservices und Datenbankverbindungen

Für Menschen, die monolithische Anwendungen in Mikrodienste aufteilen, wie gehen Sie mit dem Konnektivum des Auseinanderbrechens der Datenbank um. Typische Anwendungen, an denen ich gearbeitet habe, führen aus Gründen der Leistung und Einfachheit eine Menge Datenbankintegration durch.

Wenn Sie zwei Tabellen haben, die logisch verschieden sind (wenn Sie möchten, beschränkte Kontexte), aber häufig eine große Menge dieser Daten zusammenfassen, dann verzichten Sie im Monolith mit größter Wahrscheinlichkeit auf die Objektorientierung und verwenden stattdessen den Standard Ihrer Datenbank JOIN-Funktion zum Verarbeiten der Daten in der Datenbank, bevor die aggregierte Ansicht wieder in Ihre App-Schicht zurückgegeben wird.

Wie können Sie es rechtfertigen, solche Daten in Mikrodienste aufzuteilen, wo Sie vermutlich die Daten über eine API "verknüpfen" müssen, anstatt in der Datenbank.

Ich habe Sam Newmans Microservices-Buch gelesen und in dem Kapitel über die Aufteilung des Monolithen gibt er ein Beispiel für "Breaking Foreign Key Relationships", in dem er einräumt, dass ein Join über eine API langsamer wird - aber er sagt weiter Ihre Bewerbung ist sowieso schnell genug. Ist es wichtig, dass sie langsamer ist als zuvor?

Das scheint ein bisschen schade zu sein? Was sind die Erfahrungen der Menschen? Welche Techniken haben Sie verwendet, um die API-Joins akzeptabel auszuführen?

71
Martin Bayly
  • Wenn Leistung oder Latenz keine große Rolle spielen (ja, wir brauchen sie nicht immer.), Ist es in Ordnung, nur einfache RESTful-APIs zu verwenden, um zusätzliche Daten abzufragen, die Sie benötigen. Wenn Sie mehrere -Aufrufe an verschiedene Microservices ausführen und ein Ergebnis zurückgeben müssen, können Sie API Gateway pattern verwenden.

  • Es ist vollkommen in Ordnung, Redundanz in Polyglot-Persistenz Umgebungen zu haben. Sie können beispielsweise die Messaging-Warteschlange für Ihre Mikrodienste verwenden und bei jeder Änderung "Update" -Ereignisse senden. Andere Microservices überwachen die erforderlichen Ereignisse und speichern die Daten lokal. Statt zu fragen, halten Sie also alle erforderlichen Daten für einen bestimmten Microservice in einem geeigneten Speicher.

  • Vergessen Sie auch das Caching nicht :) Sie können Tools wie Redis oder Memcached verwenden, um das Abfragen anderer Datenbanken zu oft zu vermeiden. 

16
sap1ens

Es ist in Ordnung, dass Dienste schreibgeschützte replizierte Kopien bestimmter Referenzdaten von anderen Diensten haben.

Wenn ich versuche, eine monolithische Datenbank in Mikrodienste umzuwandeln (im Gegensatz zu rewrite), würde ich das tun 

  • erstellen Sie ein Datenbankschema für den Dienst
  • erstellen Sie versionierte * Ansichten ** in diesem Schema, um Daten aus diesem Schema anderen Diensten zugänglich zu machen
  • join Joins gegen diese Readonly-Ansichten

Dadurch können Sie die Tabellendaten/-struktur unabhängig ändern, ohne andere Anwendungen zu beschädigen.

Anstatt Ansichten zu verwenden, könnte ich auch erwägen, Trigger zu verwenden, um Daten von einem Schema in ein anderes zu replizieren.

* Die Ansichten können erweitert werden. Wenn eine grundlegende Änderung erforderlich ist, erstellen Sie eine Version 2 derselben Ansicht und entfernen Sie die alte Version, wenn sie nicht mehr benötigt wird.

5
mcintyre321

CQRS --- Command Query Aggregation Pattern ist die Antwort auf diese Frage nach Chris Richardson . Lassen Sie jeden Microservice sein eigenes Datenmodell aktualisieren und generieren Sie die Ereignisse, die die materialisierte Ansicht mit den erforderlichen Verbindungsdaten aus früheren Microservices aktualisieren. Dieses MV kann ein beliebiges NoSql-DB oder -Redis oder eine Elasticsearch-Abfrage sein, die für die Abfrage optimiert ist. Diese Techniken führen zu einer eventuellen Konsistenz, die definitiv nicht schlecht ist, und vermeidet die Echtzeit-Verknüpfungen auf der Anwendungsseite . Hoffen Sie auf diese Antworten.

3
Praful

Ich würde die Lösungen für den Einsatzbereich trennen, sagen wir operativ und Berichtswesen.

Für die Microservices, die Daten für einzelne Formulare bereitstellen, die Daten von anderen Microservices benötigen (dies ist der Betriebsfall), denke ich, dass die Verwendung von API-Joins der richtige Weg ist. Sie benötigen keine großen Datenmengen, Sie können die Datenintegration in den Dienst vornehmen.

Der andere Fall ist der Fall, in dem Sie große Abfragen zu großen Datenmengen durchführen müssen, um Aggregationen usw. (den Berichterstellungsfall) durchzuführen. Für diesen Bedarf würde ich über die Aufrechterhaltung einer gemeinsam genutzten Datenbank nachdenken - ähnlich wie bei Ihrem ursprünglichen Schema und die Aktualisierung mit Ereignissen aus Ihren Microservice-Datenbanken. In dieser gemeinsam genutzten Datenbank können Sie weiterhin Ihre gespeicherten Prozeduren verwenden, wodurch Sie weniger Aufwand benötigen und die Datenbankoptimierungen unterstützen.

1
Jaro64

In Microservices erstellen Sie diff. Lesen Sie Modelle, zB für: Wenn Sie zwei Unterschiede haben. beschränkter Kontext und jemand möchte nach beiden Daten suchen, dann muss jemand Ereignisse aus beiden beschränkten Kontext abhören und eine für die Anwendung spezifische Ansicht erstellen.

In diesem Fall wird mehr Speicherplatz benötigt, es werden jedoch keine Joins und keine Joins benötigt.

0
techagrammer