Wie gehen Sie mit gemeinsamen Konzepten in einer Microservice-Architektur um?

39

Ich recherchiere Architekturmuster für eine Anwendung, die ich entwickle, und ein Microservice- Ansatz scheint eine gute Wahl zu sein, aber ich bin nicht sicher, wie ich mit Interaktionen zwischen den Diensten umgehen soll.

Die Anwendung befasst sich hauptsächlich mit Benutzern, Profilen von Benutzern, Fotos und Tags, die ein bis mehrere Profile in einem Foto darstellen. Möglicherweise gibt es Methoden, um von einem Benutzer hochgeladene Fotos, Fotos mit einem bestimmten markierten Profil usw. zurückzugeben.

Dies ist mein erster Versuch, eine auf Mikroservices basierende Architektur zu entwerfen, und ich stamme aus einer monolithisch-esquen Domänenmodell- inspirierten Geschichte. In dieser Welt würden die Controller diese Domänenobjekte zusammenfügen, aber ich habe Probleme damit, mich darauf einzulassen, wie dies auf mikroservicem Wege funktionieren würde.

anjunatl
quelle

Antworten:

34

In der Regel rufen Dienste andere Dienste auf, wenn sie auf ihre Daten zugreifen müssen. Jedes Datenelement sollte zu einem bestimmten Dienst gehören, der der einzige Einstiegspunkt für den Zugriff auf diese Daten und ihre Änderung ist. Einige Dienste sind einfach und entsprechen in der Regel genau Ihrem Domain-Modell (z. B. ein Dienst zur Behandlung von Benutzern), während andere auf hoher Ebene Daten von anderen Diensten verwenden (z. B. eine Liste mit Fotos zusammen mit Informationen zu den Benutzern anzeigen, die sie hochgeladen haben) ).

In Ihrem Anwendungsfall sollten Sie von außen beginnen und überlegen, welche Vorgänge Sie Ihrem Benutzer über eine API zur Verfügung stellen möchten (wenn es sich um einen Back-End-Dienst handelt) oder welche Vorgänge in der GUI verfügbar sein sollten, wenn es sich um eine Webanwendung handelt. Beachten Sie, dass der GUI-Teil häufig eine reguläre Anwendung mit eigenen Controllern ist: Operationen können über REST aufgerufen werden (wie in AngularJS), aber diese Endpunkte sind nur für die Verwendung durch die GUI-Anwendung vorgesehen und keine Microservices im üblichen Sinne.

Angenommen, Sie möchten Fotos zusammen mit Informationen zu Uploadern anzeigen. Sie könnten einen Benutzerdienst haben, der Informationen über einen Benutzer mit der angegebenen Benutzer-ID zurückgibt, und einen Fotodienst, der Fotos auflisten kann (z. B. durch Suchen nach bestimmten Kriterien). Die Liste der Fotos enthält für jedes Foto die ID des hochladenden Benutzers. Auf diese Weise werden diese beiden Dienste nicht gekoppelt - der Fotodienst kennt nur die Benutzer-IDs, aber nichts über die Benutzerdaten selbst. Zusätzlich zu diesen beiden Diensten können Sie einen dritten Dienst mit einer Operation wie "Fotos mit Informationen zu Uploadern auflisten" erstellen, mit der die beiden anderen Dienste aufgerufen und die von ihnen zurückgegebenen Daten kombiniert werden. Alternativ kann dieser Vorgang von Ihrer Webanwendung anstelle eines Dienstes ausgeführt werden.

Michał Kosmulski
quelle
1
Das hat mir sehr geholfen. Ich begann damit, ein paar Anwendungsfälle für die Benutzeroberfläche zu schreiben, in denen der Stapel ausgeführt wurde, und alles passte zum größten Teil zusammen.
22.
1
In diesem speziellen Beispiel sollen wir z. 10 Anrufe beim Benutzer-Service, um Benutzerdaten zu erhalten, wenn wir 10 Fotos in unserer Liste haben? Würde das nicht viel Aufwand bedeuten?
Ricardo Souza
1
@rcdmk Sie können einen REST-Endpunkt hinzufügen, der eine Liste mit mehreren IDs als Eingabe erhält und mehrere Fotos als Ausgabe zurückgibt. Dies wird in der Praxis häufig aus Leistungsgründen durchgeführt. Manchmal ist API-Design ein Kompromiss zwischen Reinheit und praktischen Erwägungen.
Michał Kosmulski
@ MichałKosmulski Ich muss mit der Diskussion beginnen, aber das StackExchange-Design hält sie davon ab :) Was ich am Microservice-Ansatz in diesem Beispiel nicht mag, ist, dass eine direkte Abfrage der zugrunde liegenden Datenbank (in der Benutzer und Bilder gespeichert sind) viel effizienter sein könnte. Stellen Sie sich vor, diese Upstream-Dienste hängen von anderen Upstream-Diensten usw. ab. Die direkte Abfrage zum Datenspeicher ist viel sicherer. Nur meine 5 Cent - nichts weiter. Auch hier würde ich gerne eine produktive Diskussion zu diesem Thema führen, aber StackExachange ist kein guter Ort dafür (können Sie Diskussionsforen für Microservices empfehlen?)
Ajukraine
@ajukraine Ich denke, es gibt Chats auf stackexchange, die ein guter Ort für Diskussionen sein können. Was die Leistung betrifft: 1. Microservices sind mit Leistungskosten verbunden, und 2. Microservices sind für einige Situationen gut, für andere jedoch nicht. Abhängigkeiten: In Microservice-Archotectures erstellen Sie häufig lokale Kopien von Daten und verwenden asynchrones Messaging, um die Anzahl der Abhängigkeiten zu verringern. Es handelt sich um eine echte Architekturänderung, bei der nicht nur jedes Modul einer Anwendung automatisch in eine separate Anwendung geändert wird.
Michał Kosmulski
4

Die Anwendung befasst sich hauptsächlich mit Benutzern, Profilen von Benutzern, Fotos und Tags, die ein bis mehrere Profile in einem Foto darstellen. Möglicherweise gibt es Methoden, um von einem Benutzer hochgeladene Fotos, Fotos mit einem bestimmten markierten Profil usw. zurückzugeben.

Nun, der Profildienst sollte nicht mit Benutzerobjekten funktionieren. Möglicherweise kennt es nur die ID des Benutzers, für den Daten zurückgegeben werden sollen, nicht mehr. Auf diese Weise ist keine Interaktion zwischen Benutzer- und Profildienst erforderlich.

Wenn dies Ihre Frage nicht beantwortet, können Sie sie bitte klären, indem Sie die genaue Situation beschreiben, mit der Sie sich befassen.

Vladislav Rastrusny
quelle
Dies und Michals Antwort halfen mir, es zu verstehen, aber sein Vorschlag half mir, die Dienste herauszufinden, die ich brauchte. Ich war in der Einstellung gefangen, ein vollständiges Objekt darstellen zu müssen, anstatt nur einen Verweis auf das Objekt (Benutzerobjekt vs. Benutzer-ID). Vielen Dank!
22.
@anjunatl Willkommen;)
Vladislav Rastrusny