web-dev-qa-db-fra.com

Joindre une table entre différents microservices

J'essaie toujours de donner un sens à l'architecture de micro-services.

L'idée de séparer différentes applications (inclure la base de données) m'excite. Mais je suis toujours confus s’il existe deux micro-services, par exemple Produit et utilisateur. le produit et l'utilisateur possèdent respectivement le produit de table et l'utilisateur dans leur base de données. Selon les meilleures pratiques en matière de service micro, nous ne pouvons accéder à la base de données qu'à partir du service. 

Le problème est, supposons que nous ayons une table de produit avec une colonne user_id. Nous voulons faire une recherche de produit qui renvoie également le nom de l'utilisateur qui crée le produit. Cela nécessite une jointure entre la table produit dans le micro-service produit et la table utilisateur dans le micro-service utilisateur. Comment gérez-vous cela? 

10
Robert Limanto

Vous devrez appeler chaque microservice et effectuer la jointure manuellement ou transmettre les identifiants d’utilisateur correspondants à chaque service.

UserMicroservice: 

SELECT * FROM Users WHERE some condition is true

Récupère la liste des utilisateurs avec leur ids.

ProductMicroserivce: 

SELECT * FROM Products WHERE some condition is true AND userId IN (.........)

Pour que les utilisateurs et les produits puissent toujours se trouver dans deux bases de données différentes, les produits auront simplement besoin du concept d'utilisateur ID.

L'inverse peut également être fait, ProductMicroserivce: 

SELECT * FROM Products WHERE some condition is true

Extrayez tous les UserIds puis appelez le UserMicroservice: 

SELECT * FROM Users WHERE some condition is true AND id IN (.........)
6

Bien que je pense qu'il n'y a rien de mal à le faire, comme l'a suggéré Jan, j'aimerais ajouter que la différence que les microservices devraient ajouter à votre système est d'une nature différente. 

La séparation ci-dessus des services est ce que nous avons beaucoup vu dans le monde [SOA] _ et elle s'est avérée trop complexe très rapidement sans offrir beaucoup de valeur.

Si vous comprenez, et je comprends que ce n’est qu’un exemple, que vous avez besoin d’interroger un utilisateur connecté à un produit, pourquoi diviser le service? Vous finissez par concevoir un service par entité de base de données au lieu de regarder quelles sont les exigences pour un contexte donné, ce qui me semble lié.

-Lars

8
Lars

La meilleure réponse à de tels scénarios est CQRS. Maintenir les vues matérialisées de la relation utilisateur/produit. Les vues métralisées peuvent être tout ce qui fournit une faible latence en lecture, comme les bases de données NoSql. Chaque fois que Command met à jour un utilisateur ou un produit à l'aide de ses microservices, les événements correspondants doivent être générés et capturés par un autre service gérant ce visualiseur matérialisé. Ce service sera utilisé pour extraire la requête qui vous intéresse. Gardez toujours à l'esprit que l'architecture de Microservices croit en la cohérence éventuelle, ce qui n'est certainement pas une mauvaise chose :) .Hope cela répond à votre question.

2
Praful