Datenübergreifende Suche über mehrere Mikrodienste

12

Ich habe Daten für eine bestimmte Domain, die zwischen einem Mikrodienst und einer alten Datenbank verteilt sind. Ich habe eine Suche, die sowohl Felder in der Legacy- als auch in der Microservice-Datenbank umfasst. Zuvor (vor dem Mikroservice-Split) wurde eine SQL-Abfrage durchgeführt. Jetzt benötige ich einen REST-Aufruf und eine Abfrage an die alte Datenbank, um diese Suchfunktion bereitzustellen. Wir sprechen hier über ein paar Millionen Zeilen. Wie kann ich das am besten modellieren? Aufgrund des Datenvolumens gibt der REST-Aufruf in der Regel auch paginierte Ergebnisse zurück. Der naive Ansatz, einen SQL-Aufruf auszulösen und die Ergebnisse mit der REST-Antwort zu kombinieren und zusammenzuführen, ist zu langsam und nicht wirklich praktisch.

senseiwu
quelle

Antworten:

20

Eine Suchfunktion kann als separater Dienst mit einer anderen Verantwortung als die beiden von Ihnen genannten Dienste modelliert werden. Hier könnte der Ansatz darin bestehen, einen neuen Dienst ("Suche") zu erstellen und eine Kopie der Daten von beiden Diensten in einer Form zu speichern, die einfach zu indizieren und zu suchen ist, möglicherweise auch denormalisiert, um schnell Ergebnisse zu erzielen das gewünschte Format.

So könnten Sie zum Beispiel die ältere SQL-Datenbank mit zB mySql, den anderen Microservice mit zB MongoDB und den neuen Suchdienst mit elasticsearch mit Daten aus beiden zusammenfügen (denormalisiert), um bequemer darauf zugreifen zu können. Natürlich hängen die Details von der Art der Suche ab, die Sie durchführen müssen.

Daten aus den beiden Diensten werden am besten asynchron über einen Ereignisbus wie Kafka oder Hermes in den Suchindex übertragen, um den Durchsatz zu erhöhen und die Kopplung zwischen den Diensten zu verringern. Bei einer Änderung eines der beiden Dienste wird ein Ereignis gesendet, das den Suchdienst darüber informiert, dass auch seine Daten aktualisiert werden sollen.

Natürlich entstehen Kosten für eine zusätzliche Verzögerung zwischen Änderungen der Dienste und des Suchdienstes, aber da Mikrodienste normalerweise in verteilten Systemen verwendet werden, sind einige Verzögerungen und vorübergehende Inkonsistenzen ohnehin unvermeidbar. Ein zusätzlicher Dienst und die Verwendung von zusätzlichem Speicher für eine Kopie von Daten, die sich bereits in den beiden anderen Diensten befindet, sind ebenfalls typische Kosten für ein hoch verteiltes und skalierbares System, das Mikrodienste verwendet.

Michał Kosmulski
quelle
Ich habe schon darüber nachgedacht, einen separaten Dienst zu erstellen. Das einzige, was mir etwas unangenehm ist - das Erstellen einer weiteren Datenbank nur für die Suche (das Einspeisen in Elastic wäre eine weitere Option, aber wir haben einige Infrastrukturengpässe)
senseiwu
7
@zencv Mikrodienstleistungen sind leider mit solchen Kosten verbunden. Horizontales Skalieren bedeutet, dass die Kopplung schwach sein muss, und dies bedeutet, dass häufig Daten dupliziert werden. Sie erhalten auch viel mehr Netzwerkverkehr. Skalierbarkeit bedeutet häufig einen Rückgang der Leistung pro Hardwareeinheit, und die Auswahl einer Architektur gegenüber einer anderen (z. B. Microservices vs. Monolith) muss diesen Kompromiss berücksichtigen.
Michał Kosmulski