J'ai une application pour laquelle j'ai un backend dans node. Supposons qu'il existe un point de terminaison d'API (/ get_menu) pour obtenir tous les menus.
Lorsque l'application appelle / get_menu, j'appelle les API externes de différents restaurants et lorsque tous retournent leur menu, je l'envoie à l'application. J'utilise Promise.all pour cela.
Étant donné que certains restaurants prennent beaucoup de temps, je souhaite renvoyer les données à l'application, car je continue de recevoir des données des API des restaurants. Par exemple, si deux d'entre eux renvoient leur menu instantanément, je les renvoie à l'application et après cela, alors que je continue à obtenir des données pour d'autres API, je continue de les envoyer à l'application.
Quels sont les bons moyens d'y parvenir avec un seul point de terminaison d'API, c'est-à-dire / get_menu?
3 Réponses :
Il y a quelques solutions pour cette p>
Pour vous donner une réponse littérale pour ce que vous demandez, vous pouvez utiliser certains Mise en œuvre de socket comme Socket.IO pour envoyer des données à votre client Chaque fois que vous voulez. p> li>
La deuxième option serait de persister le menu des restaurants une base de données et servir l'utilisateur à partir de là. En arrière-plan, Mettez à jour périodiquement votre base de données avec un cron. Ce n'est pas vraiment conseillé de garder votre utilisateur à attendre jusqu'à ce que tout votre menu API soit résolu. p> li> ol>
Je suggérerais d'utiliser un mécanisme de file d'attente basé sur Redis pour cela. Vous pouvez pousser chaque API en tant que tâche dans cette file d'attente.
Il existe un très bon package npm de file d'attente basé sur Redis Bull . Il y a des événements à notifier lorsqu'un traitement de travail est terminé. Vous pouvez ensuite renvoyer les données à l'application une fois le travail terminé.
Implémentez un web worker sur le javascript côté client qui utilise un UUID (ID unique pour demander que le serveur récupère la liste des menus)
Le serveur créera alors une entrée de base de données attribuant aux différentes requêtes API distantes chacune un identifiant unique. Ensuite, node.js renvoie immédiatement une liste des ID de demande au client et est rendue. Une tâche d'arrière-plan pour récupérer les menus est exécutée séparément, chaque fois qu'un résultat arrive, il est stocké dans une base de données. Le travailleur Web client demandera périodiquement la liste des UUID dont il a besoin et le serveur répondra avec ceux qui ont répondu. les données sont supprimées une fois envoyées au client et le client rend les résultats et supprime cet uuid de sa liste de requêtes pour récupérer des données ..
C'est essentiellement une file d'attente de résultats grossière peu fiable qui peut fonctionner en toute sécurité tant que votre serveur peut suivre toutes les requêtes.
Voir également "Sources d'événements" sur Internet.
Une version plus moderne de ceci implique une implémentation similaire à l'aide de websockets et d'un serveur websocket si votre hôte est très fiable.
Vous n'utilisez probablement pas
Promise.all?