Architecture actuelle :
Problème :
Nous avons un flux en deux étapes entre les couches frontale et dorsale.
- Première étape : Le frontend valide une entrée I1 de l'utilisateur sur le microservice 1 (MS1)
- Deuxième étape : Le frontend soumet I1 et plus d'informations au microservice 2
Le micro service 2 (MS2) a besoin de valider l'intégrité de I1 car il provient du frontend. Comment faire pour éviter une nouvelle requête à MS1 ? Quelle est la meilleure approche ?
Flux que j'essaie d'optimiser en supprimant les étapes 1.3 et 2.3
Flux 1 :
- 1.1 L'utilisateur X demande des données (MS2_Data) à MS2
- 1.2 L'utilisateur X persiste les données (MS2_Data + MS1_Data) sur MS1
- 1.3 Le MS1 vérifie l'intégrité des MS2_Data à l'aide d'une requête HTTP B2B.
- 1.4 Le MS1 utilise MS2_Data et MS1_Data pour conserver la base de données 1 et construire la réponse HTTP.
Flux 2 :
- 2.1 L'utilisateur X a déjà des données (MS2_Data) stockées dans la mémoire locale/session.
- 2.2 L'Utilisateur X persiste les données (MS2_Data + MS1_Data) sur MS1
- 2.3 Le MS1 vérifie l'intégrité des MS2_Data à l'aide d'une requête HTTP B2B.
- 2.4 Le MS1 utilise MS2_Data et MS1_Data pour conserver la base de données 1 et construire la réponse HTTP.
Approche
Une approche possible est d'utiliser une requête HTTP B2B entre MS2 et MS1 mais nous dupliquerions la validation dans la première étape. Une autre approche consisterait à dupliquer les données de MS1 à MS2, mais cette solution est prohibitive en raison de la quantité de données et de leur nature volatile. La duplication ne semble pas être une option viable.
Une solution plus appropriée, à mon avis, serait que le frontend ait la responsabilité d'aller chercher toutes les informations requises par le micro service 1 sur le micro service 2 et de les fournir au micro service 2. Cela évitera toutes ces requêtes HTTP B2B.
Le problème est de savoir comment le microservice 1 peut faire confiance aux informations envoyées par le frontend. Peut-être qu'en utilisant JWT pour signer d'une manière ou d'une autre les données du microservice 1 et le microservice 2 sera en mesure de vérifier le message.
Note Chaque fois que le microservice 2 a besoin d'informations de la part du microservice 1, une demande http B2B est effectuée. (La requête HTTP utilise ETAG et Contrôle du cache : max-age ). Comment éviter cela ?
Objectif de l'architecture
Le micro-service 1 a besoin des données du micro-service 2 à la demande pour pouvoir faire persister les données MS1_Data et MS2_Data dans la base de données MS1. L'approche ASYNC utilisant un courtier ne s'applique donc pas ici.
Ma question est de savoir s'il existe un modèle de conception, une meilleure pratique ou un cadre pour permettre ce type de communication.
L'inconvénient de l'architecture actuelle est le nombre de requêtes HTTP B2B qui sont effectuées entre chaque microservice. Même si j'utilise un mécanisme de contrôle du cache, le temps de réponse de chaque micro-service sera affecté. Le temps de réponse de chaque micro-service est critique. L'objectif ici est d'archiver une meilleure performance et d'utiliser le frontend comme une passerelle pour distribuer les données à travers plusieurs micro-services mais en utilisant un mécanisme de contrôle de cache. communication de poussée .
MS2_Data est juste un SID d'entité comme le SID du produit ou le SID du fournisseur que le MS1 doit utiliser pour maintenir l'intégrité des données.
Solution possible
L'idée est d'utiliser la passerelle comme une passerelle api de traitement des demandes qui mettra en cache certaines réponses HTTP de MS1 et MS2 et les utilisera comme réponse à MS2 SDK et MS1 SDK. De cette façon, aucune communication (SYNC OU ASYNC) n'est faite directement entre MS1 et MS2 et la duplication des données est également évitée.
Bien sûr, la solution ci-dessus ne concerne que les UUID/GUID partagés entre les microservices. Pour les données complètes, un bus d'événements est utilisé pour distribuer les événements et les données entre les microservices de manière asynchrone (modèle d'approvisionnement en événements).
Inspiration : https://aws.amazon.com/api-gateway/ et https://getkong.org/
Questions et documentation connexes :
- Comment synchroniser la base de données avec les microservices (et le nouveau) ?
- https://auth0.com/blog/introduction-to-microservices-part-4-dependencies/
- Transactions entre microservices REST ?
- https://en.wikipedia.org/wiki/Two-phase_commit_protocol
- http://ws-rest.org/2014/sites/default/files/wsrest2014_submission_7.pdf
- https://www.tigerteam.dk/2014/micro-services-its-not-only-the-size-that-matters-its-also-how-you-use-them-part-1/