Le contexte :
Je suis en train de construire une application et l'architecture proposée est pilotée par les événements et les messages sur une architecture de microservices.
La façon monolithique de faire les choses est que j'ai une User/HTTP request
et que les actions certaines commandes qui ont un direct synchronous response
. Ainsi, répondre à la même demande utilisateur/HTTP est "sans souci".
Le problème :
L'utilisateur envoie un HTTP request
au Service UI (il existe plusieurs services d'interface utilisateur) qui envoie certains événements à une file d'attente (Kafka/RabbitMQ/toutes sortes). Un certain nombre de services récupèrent cet événement/message, font un peu de magie en cours de route et puis, à un moment donné, ce même service d'interface utilisateur devrait récupérer cette réponse et la renvoyer à l'utilisateur à l'origine de la demande HTTP. Le traitement des demandes est ASYNC
mais le User/HTTP REQUEST->RESPONSE
es SYNC
comme pour une interaction HTTP typique.
Question : Comment puis-je envoyer une réponse au même service d'interface utilisateur que celui qui est à l'origine de l'action (le service qui interagit avec l'utilisateur via HTTP) dans ce monde agnostique/conduit par les événements ?
Mes recherches jusqu'à présent J'ai fait des recherches et il semble que certaines personnes résolvent ce problème en utilisant les WebSockets.
Mais la couche de complexité est qu'il doit y avoir une table qui met en correspondance (RequestId->Websocket(Client-Server))
qui est utilisé pour "découvrir" quel nœud de la passerelle possède la connexion websocket pour une réponse particulière. Mais même si je comprends le problème et sa complexité, je suis bloqué par le fait que je ne trouve aucun article qui me donnerait des informations sur la façon de résoudre ce problème au niveau de la couche de mise en œuvre. ET ce n'est toujours pas une option viable en raison des intégrations tierces telles que les fournisseurs de paiements (WorldPay) qui attendent REQUEST->RESPONSE
- surtout sur la validation de la 3DS.
Je suis donc quelque peu réticent à l'idée que les WebSockets soient une option. Mais même si les WebSockets sont acceptables pour les applications Webfacing, pour les API qui se connectent à des systèmes externes, ce n'est pas une bonne architecture.
** ** ** Mise à jour : ** ** **
Même si le polling long est une solution possible pour une API de service Web avec une 202 Accepted
a Location header
et un retry-after header
il ne serait pas performant pour un site web à haute concurrence et à haute capacité. Imaginez qu'un grand nombre de personnes essaient d'obtenir la mise à jour de l'état de la transaction à CHAQUE demande qu'elles font et que vous devez invalider le cache du CDN (allez jouer avec ce problème maintenant ! ha).
Mais le plus important et le plus pertinent dans mon cas, c'est que j'ai des API tierces, comme les systèmes de paiement, où les systèmes 3DS ont des redirections automatiques qui sont gérées par le système du fournisseur de paiement et qui s'attendent à une réponse typique. REQUEST/RESPONSE flow
Ce modèle ne me conviendrait donc pas, pas plus que le modèle des prises de courant.
En raison de ce cas d'utilisation, l HTTP REQUEST/RESPONSE
devrait être traité de la manière typique où j'ai un client muet qui s'attend à ce que la complexité du prétraitement soit gérée en back-end.
Je cherche donc une solution où, à l'extérieur, je dispose d'un système typique de contrôle de la qualité. Request->Response
(SYNC) et la complexité de l'état (ASYNCronie du système) est gérée en interne.
Un exemple d'interrogation longue, mais ce modèle ne fonctionnerait pas pour les API tierces comme le fournisseur de paiements sur 3DS Redirects
qui ne sont pas sous mon contrôle.
POST /user
Payload {userdata}
RETURNs:
HTTP/1.1 202 Accepted
Content-Type: application/json; charset=utf-8
Date: Mon, 27 Nov 2018 17:25:55 GMT
Location: https://mydomain/user/transaction/status/:transaction_id
Retry-After: 10
GET
https://mydomain/user/transaction/status/:transaction_id
8 votes
Si vous ne souhaitez pas mettre en place une communication bidirectionnelle avec le client, renvoyez l'adresse suivante 202 Accepté avec un En-tête de localisation qui indique au client où il peut s'adresser pour savoir quand le traitement est terminé. Il s'agit d'un modèle courant pour gérer les requêtes HTTP de longue durée auxquelles vous ne pouvez pas répondre immédiatement.
2 votes
Moi aussi, je me suis posé des questions et j'ai cherché une telle solution après avoir lu l'article du blog de Confluent sur Kafka ici. confluent.io/blog/build-services-backbone-events
0 votes
Jonathan : Qu'avez-vous découvert ?