web-dev-qa-db-fra.com

Processus d'arrière-plan dans Node.js

Qu'est-ce qu'une bonne approche pour gérer les processus en arrière-plan dans une application NodeJS?

Scénario: Après qu'un utilisateur ait posté quelque chose dans une application, je souhaite traiter les données, demander des données supplémentaires à des ressources externes, etc. Tout cela prend beaucoup de temps. boucle de res. L’idéal serait d’avoir juste une file d’emplois sur laquelle vous pouvez rapidement déposer un travail et qu’un démon ou un gestionnaire de tâches prendra toujours le plus ancien et le traite.

Dans RoR, je l'aurais fait avec quelque chose comme un travail différé. Quel est l'équivalent Node de cette API)?

80
Ole Spaarmann

Si vous voulez quelque chose de léger, qui s'exécute dans le même processus que le serveur, je recommande vivement Bull . Il a une API simple qui permet un contrôle fin de vos files d'attente.

Si vous cherchez quelque chose qui fonctionne comme un processus de travail autonome, cherchez peut-être Kue . Il peut fonctionner en tant que serveur d'API RESTful et plusieurs applications frontales y sont même écrites.

Si vous connaissez Ruby's Resque, il existe une implémentation de nœud appelée Node-resque

Bull, Kue et Node-resque sont tous protégés par Redis , omniprésent parmi les files d'attente de travailleurs Node.js. Tous les 3 pourraient faire ce que RoR's DelayedJob fait, c'est une question de fonctionnalités spécifiques que vous voulez et vos préférences d'API.

97
Yuri Zarubin

Les tâches en arrière-plan ne sont pas directement liées au travail de votre service Web, elles ne doivent donc pas suivre le même processus. À mesure que vous augmentez votre capacité, l'utilisation de la mémoire des tâches en arrière-plan aura une incidence sur les performances du service Web. Mais vous pouvez les mettre dans le même référentiel de code si vous le souhaitez, ce qui est plus logique.

Un bon choix pour la messagerie entre les deux processus serait redis , si le fait de laisser tomber un message de temps en temps est OK. Si vous voulez "pas de message laissé", vous aurez besoin d'un courtier plus lourd comme Rabbit . Votre processus de service Web peut être publié et votre processus de travail en arrière-plan peut être abonné.

Il n'est pas nécessaire que les deux processus soient co-hébergés, ils peuvent se trouver sur des ordinateurs virtuels distincts, des conteneurs Docker, quoi que vous utilisiez. Cela vous permet d'évoluer sans trop de problèmes.

25
wberry

Si vous utilisez MongoDB, je recommande Agenda . Ainsi, des instances Redis distinctes ne sont pas en cours d'exécution et des fonctionnalités telles que la planification, la mise en file d'attente et l'interface utilisateur Web sont toutes présentes. Agenda UI est facultatif et peut être exécuté séparément bien sûr.

Nous vous recommandons également de configurer une abstraction faiblement couplée entre la logique de votre application et le système de mise en file d'attente/planification afin que l'ensemble du système de traitement en arrière-plan puisse être échangé si nécessaire. En d'autres termes, éloignez le plus possible la logique d'application/de traitement de vos définitions de travail Agenda afin de les maintenir légères.

10
sean2078

Je voudrais suggérer d'utiliser Redis pour la planification des travaux. Il a beaucoup de structures de données différentes, vous pouvez toujours en choisir une qui convient le mieux à votre cas d'utilisation.

Vous avez parlé de RoR et de DJ, alors je suppose que vous connaissez Sidekiq. Vous pouvez utiliser node-sidekiq pour la planification des tâches si vous le souhaitez, mais son imo sous-optimal, car son objectif principal est d'intégrer nodejs à RoR.

Pour la démonisation des travailleurs, je vous recommande d'utiliser PM2 . Il est largement utilisé et activement entretenu. Il résout de nombreux problèmes (déploiement, surveillance, mise en cluster, par exemple), alors assurez-vous que ce ne sera pas excessif pour vous.

2
stefkin

J'ai essayé bee-queue & taurea et j'ai choisi taureau à la fin. J'ai d'abord choisi bee-queue car c'est assez simple, leurs exemples sont faciles à comprendre, alors que ceux de Bull sont un peu compliqués. le wiki de l'abeille Origine de la file d'attente des abeilles résonne aussi avec moi. Mais le problème avec bee est <1> que le temps de résolution des problèmes est assez lent, leur dernière mise à jour datant de 10 mois. <2> Je ne trouve pas de moyen facile de suspendre/annuler le travail.

Bull, en revanche, met fréquemment à jour leurs codes, en réponse aux problèmes rencontrés. Évaluation de la file d'attente des tâches Node.js La faiblesse de Bull est "un temps de résolution lent", mais mon expérience est l'inverse!

Mais de toute façon, leur api est similaire, il est donc assez facile de passer de l’un à l’autre.

1
Qiulang