web-dev-qa-db-fra.com

Recherche dans les données sur plusieurs microservices

J'ai des données pour un certain domaine réparties entre un microservice et une base de données héritée. J'ai une recherche qui couvre les champs de la base de données héritée et microservice. Auparavant (avant le fractionnement du microservice), cela se faisait avec 1 requête sql. Maintenant, j'ai besoin d'un appel REST et d'une requête vers la base de données héritée pour servir cette fonctionnalité de recherche. Nous parlons ici de quelques millions de lignes. Comment puis-je mieux modéliser cela? En raison du volume de données, REST call renvoie également des résultats paginés. Approche naïve pour déclencher un appel SQL et combiner et fusionner les résultats avec la réponse REST est trop lente et pas vraiment pratique) .

13
senseiwu

Une fonction de recherche peut être modélisée comme un service distinct avec une responsabilité distincte des deux services que vous mentionnez. Ainsi, l'approche ici pourrait être de créer un nouveau service (`` recherche '') et de lui faire stocker une copie des données des deux services sous une forme facile à indexer et à rechercher, éventuellement également dénormalisée afin de donner rapidement des résultats dans le format souhaité.

Ainsi, par exemple, vous pourriez avoir la base de données SQL héritée en utilisant par exemple mySql, l'autre microservice utilisant par ex. MongoDB et le nouveau service de recherche utilisant elasticsearch avec des données des deux déjà collées ensemble (dénormalisées) pour un accès plus pratique. bien sûr, les détails dépendront du type de recherches que vous devez effectuer.

Les données des deux services seraient mieux transférées de manière asynchrone à l'index de recherche via un bus d'événements tel que Kafka ou Hermes afin d'augmenter le débit et de réduire le couplage entre les services. Un changement dans l'un des deux services enverraient un événement informant le service de recherche de mettre également à jour ses données.

Bien sûr, il y a le coût d'un délai supplémentaire entre les changements dans les services et dans le service de recherche, mais comme les microservices sont généralement utilisés dans les systèmes distribués, certains retards et incohérences temporaires sont de toute façon inévitables. Avoir un service supplémentaire et utiliser du stockage supplémentaire pour une copie de données qui se trouve déjà dans les deux autres services est également un coût typique d'avoir un système hautement distribué et évolutif utilisant des microservices.

21
Michał Kosmulski