Ich habe derzeit zwei Microservices. Wir werden sie anrufen A
und B
.
Die Datenbank unter Microservice A
enthält die folgende Tabelle:
A
|-- users
Die Datenbank unter Microservice B
enthält die folgende Tabelle:
B
|-- trackers
Die Anforderungen besagen dies users
und trackers
haben eine Viele-zu-Viele-Beziehung.
Ich bin mir nicht sicher, wie ich das in einer Microservices-Architektur richtig handhaben soll.
Ich konnte sehen, dass dies auf drei Arten funktioniert:
- Dem
user_trackers
Microservice wird eine Tabelle hinzugefügtA
. Dies verhält sich ähnlich wie eine Join-Tabelle, die "Fremdschlüssel" fürusers
und enthälttrackers
. - Dem
owners
Microservice wird eine Tabelle hinzugefügtB
. Diese Tabelle verhält sich ähnlich wie eine polymorphe Verknüpfungstabelle. Dies würde es jedem Dienst ermöglichen, eine Zuordnung zu einem Tracker herzustellen. Dies könnte ungefähr so aussehen:B |-- trackers |-- owners |-- owner_id |-- owner_type |-- tracker_id
- Führen Sie Aufzeichnungen für
users
undtrackers
in jedem Microservice. Halten Sie sie mit einer Art Pubsub-System synchron.
Ich wollte ursprünglich Option 2 wählen, weil mir gefallen hat, dass die Transaktionsgrenzen erhalten bleiben. Ich kann einen Tracker erstellen und ihn atomar mit etwas verknüpfen. Es scheint jedoch nicht für den Mikroservice geeignet zu sein B
. Warum sollte sich Microservice B
darum kümmern, dass Microservice A
eine Assoziation erstellen möchte?
Ich habe das Gefühl, dass es hier wahrscheinlich ein gutes Muster gibt, das mir nicht bekannt ist. Ist eine der von mir festgelegten Optionen sinnvoll? Gibt es eine andere Option, die sinnvoller sein könnte?
quelle
Zapadlos Antwort enthält viele gute Informationen und Argumente. Ich werde hier ein paar praktische Ratschläge hinzufügen, die es möglicherweise einfacher machen, Ihre Probleme und die Ratschläge in dieser Antwort zu bearbeiten.
Die Art und Weise, wie Sie Ihre Entwurfsfrage formuliert haben, bezieht sich auf Datenbankstrukturen und darauf, wie Sie eine neue Anforderung für Ihre Strukturen in diese einfügen können. Dies bedeutet, dass Sie das Service-Design aus Ihrem Datenmodell erstellen. Was ich zum Beispiel nicht sehe, ist, wie auf die Beziehung zwischen Benutzern und Trackern zugegriffen oder diese verwendet werden soll.
Beim Service-Design ist die Struktur der Schnittstelle das Wichtigste am Design. Tatsächlich ist die Implementierung im Vergleich insbesondere bei Mikrodiensten nahezu irrelevant. Der Grund dafür ist, dass nach dem Einrichten Ihres Dienstes alle Abhängigkeiten von Ihrem Dienst nur auf der Schnittstelle bestehen sollten. Wenn Sie es richtig machen, sollten Sie in der Lage sein, die Implementierung ohne Verbraucher vollständig neu zu schreiben. Und das ist der Hauptvorteil der Autonomie. Es interessiert niemanden, wie du es gebaut hast. Sie brauchen es nur, um so zu funktionieren, wie Sie es kommuniziert haben.
Bevor jemand bestimmen kann, wie dies in der Datenbank aussieht oder wo Sie dies möchten, müssen Sie wirklich erklären, wie diese Informationen verwendet werden. Ist dies etwas, das durch einen Dienst verfügbar gemacht wird, oder handelt es sich um eine Art von Daten, die Sie für die Analyse mischen möchten?
Nebenbei bemerkt würde ich bidirektionale Abhängigkeiten um fast jeden Preis vermeiden. Wenn Sie Abhängigkeiten haben, möchten Sie wirklich, dass nur eine Seite über die andere Bescheid weiß. Sobald die Abhängigkeiten in beide Richtungen verlaufen, werden sie im Wesentlichen zu einer atomaren Einheit.
quelle
Vieles davon hängt von der Domain selbst ab. Wenn ein Benutzer mit Null-Trackern keinen Sinn ergibt, muss der Benutzerdienst über Tracker Bescheid wissen. Wenn ein Tracker einen Benutzer haben muss, müssen Tracker über Benutzer Bescheid wissen. Wenn etwas wie ein Tracker mit mehreren Eigentümern oder die Möglichkeit, einen Tracker von einem Benutzer auf einen anderen zu übertragen, sinnvoll ist, gehören diese Informationen möglicherweise zu einem anderen Dienst.
quelle
Frage: Warum werden Ihre Daten entlang der Datentabellen getrennt?
Ich würde eher zu Option 3 gehen: Die Dienste sind völlig getrennt und können die jeweiligen Fragen beantworten, die sie möglicherweise beantworten müssen. Darüber hinaus sind sie viel widerstandsfähiger. Seien Sie jedoch vorsichtig, Ihre Dienste können die Synchronisierung aufheben, wenn sie Ereignisse verpassen. Dies kann jedoch durch eventuelle Konsistenz behoben werden.
Sie könnten auch in Betracht ziehen, beide Dienste zusammenzuführen. Wenn beide nicht antworten können, ohne sich gegenseitig zu kennen, würde ich sie einfach zusammenführen, da sie wahrscheinlich Teil einer einzelnen Domain sind.
quelle