Comment gérez-vous les concepts partagés dans une architecture de microservice?
40
Je suis à la recherche de modèles architecturaux pour une application que je développe et une approche de microservice semble être un bon choix, mais je ne sais pas comment gérer les interactions entre les services.
L'application traite principalement des utilisateurs, des profils appartenant à des utilisateurs, des photos et des balises représentant un à plusieurs profils d'une photo. Il serait concevable qu'il existe des méthodes pour renvoyer les photos téléchargées par un utilisateur, renvoyer des photos contenant un certain profil étiqueté, etc.
C’est la première fois que j’essaie de concevoir une architecture reposant sur un microservice. Je viens d’une histoire inspirée par les modèles monolithiques . Dans ce monde, les contrôleurs associent ces objets de domaine, mais j'ai du mal à comprendre comment cela fonctionnerait sous forme de microserveur.
Habituellement, les services appellent d'autres services lorsqu'ils ont besoin d'accéder à leurs données. Chaque donnée doit appartenir à un service particulier qui sera le seul point d’entrée pour accéder à ces données et les modifier. Certains services seront simples et correspondront généralement étroitement à votre modèle de domaine (par exemple, un service de gestion des utilisateurs), tandis que d'autres seront de haut niveau et utiliseront les données d'autres services (par exemple, afficher une liste de photos avec des informations sur les utilisateurs qui les ont téléchargées. ).
Dans votre cas d'utilisation, commencez par l'extérieur et réfléchissez aux opérations que vous souhaitez mettre à la disposition de votre utilisateur via une API (s'il s'agit d'un service backend) ou quelles opérations doivent être disponibles dans l'interface graphique s'il s'agit d'une application Web. Notez que la partie graphique est souvent une application régulière avec ses propres contrôleurs: les opérations peuvent être appelées via REST (comme dans AngularJS), mais ces noeuds finaux sont conçus uniquement pour l'utilisation de l'application graphique et ne constituent pas des microservices au sens commun.
Supposons que vous souhaitiez afficher des photos avec des informations sur les téléchargeurs. Vous pourriez avoir un service utilisateur qui renvoie des informations sur un utilisateur à partir de son identifiant et un service photo pouvant répertorier des photos (par exemple en effectuant une recherche selon certains critères). La liste des photos contiendrait pour chaque photo l'identifiant de l'utilisateur chargé du téléchargement. De cette façon, ces deux services ne sont pas couplés - le service photo ne connaît que les identifiants d’utilisateur, mais rien sur les données de l’utilisateur lui-même. En plus de ces deux services, vous pouvez créer un troisième service avec une opération telle que "liste des photos avec des informations sur les téléchargeurs", qui appelle les deux autres services et combine les données qu’ils renvoient. Cette opération peut également être effectuée par votre application Web au lieu d'un service.
Cela m'a beaucoup aidé. J'ai commencé par écrire quelques cas d'utilisation de l'interface utilisateur qui permettraient de tirer parti de la pile, et tout s'est mis en place.
Anjunatl
1
Dans cet exemple particulier, sommes-nous censés faire, par exemple. 10 appels au service utilisateur pour obtenir les données utilisateur si nous avons 10 photos dans notre liste? Ne serait-il pas ajouter beaucoup de frais généraux?
Ricardo Souza
1
@rcdmk Vous pouvez ajouter un point de terminaison REST qui obtient une liste de plusieurs ID en entrée et renvoie plusieurs photos en sortie. Cela se fait souvent dans la pratique pour des raisons de performance. Parfois, la conception des API est un compromis entre pureté et considérations pratiques.
Michał Kosmulski
@ MichałKosmulski J'ai besoin de lancer la discussion, mais la conception de StackExchange les décourage :) Imaginez si ces services en amont dépendent d'autres services en amont, etc. La requête directe au magasin de données est beaucoup plus sûre. juste mes 5 cents - rien de plus. Encore une fois, j'aimerais vraiment avoir une discussion productive sur le sujet, mais StackExachange n'est pas un bon endroit pour cela (pouvez-vous recommander des forums de discussion sur microservices?)
ajukraine
@ajukraine Je pense qu'il y a des discussions sur stackexchange qui peuvent être un bon endroit pour des discussions. En ce qui concerne les performances: 1. Les microservices ont un coût de performance, et 2. Les microservices sont bons pour certaines situations mais pas pour d'autres. En ce qui concerne les dépendances: dans les archotectures de microservices, vous effectuez souvent des copies locales des données et utilisez une messagerie asynchrone afin de réduire le nombre de dépendances. Il s’agit d’un véritable changement d’architecture, qui ne consiste pas simplement à changer automatiquement chaque module d’une application en une application distincte.
Michał Kosmulski
4
L'application traite principalement des utilisateurs, des profils appartenant à des utilisateurs, des photos et des balises représentant un à plusieurs profils d'une photo. Il serait concevable qu'il existe des méthodes pour renvoyer les photos téléchargées par un utilisateur, renvoyer des photos contenant un certain profil étiqueté, etc.
Eh bien, le service de profil ne devrait pas fonctionner avec un objet utilisateur. Il peut ne connaître que l'ID de l'utilisateur pour lequel il est demandé de renvoyer des données, pas plus. De cette façon, vous n'aurez pas besoin d'interaction entre le service utilisateur et le service de profil.
Si cela ne répond pas à votre question, pourriez-vous clarifier la situation en décrivant la situation exacte à laquelle vous faites face?
Ceci et la réponse de Michal m'ont aidé à comprendre, mais sa suggestion m'a aidé à définir les services dont j'avais besoin. J'étais coincé dans un état d'esprit de devoir représenter un objet complet au lieu d'une simple référence à l'objet (objet utilisateur vs identifiant utilisateur). Très apprécié, merci!
Eh bien, le service de profil ne devrait pas fonctionner avec un objet utilisateur. Il peut ne connaître que l'ID de l'utilisateur pour lequel il est demandé de renvoyer des données, pas plus. De cette façon, vous n'aurez pas besoin d'interaction entre le service utilisateur et le service de profil.
Si cela ne répond pas à votre question, pourriez-vous clarifier la situation en décrivant la situation exacte à laquelle vous faites face?
la source