Quelle est la bonne approche pour gérer les processus d'arrière-plan dans une application NodeJS?
Scénario : après qu'un utilisateur a publié quelque chose sur une application, je veux analyser les données, demander des données supplémentaires à des ressources externes, etc. Tout cela prend beaucoup de temps, donc je veux qu'il soit hors de la boucle req / res. L'idéal serait d'avoir simplement une file d'attente de travaux sur laquelle vous pouvez vider rapidement un travail et un démon ou un exécuteur de tâches prendra toujours le plus ancien et le traitera.
Dans RoR, je l'aurais fait avec quelque chose comme Delayed Job. Quel est l'équivalent Node de cette API?
javascript
node.js
background-process
task-queue
Ole Spaarmann
la source
la source
ChildProcess
API qui pourrait être utile. nodejs.org/api/child_process.htmlRéponses:
Si vous voulez quelque chose de léger, qui fonctionne dans le même processus que le serveur, je recommande fortement Bull . Il dispose d'une API simple qui permet un contrôle fin sur vos files d'attente.
Si vous recherchez quelque chose qui fonctionne en tant que processus de travail autonome, consultez peut-être Kue . Il peut fonctionner en tant que serveur API RESTful et a même plusieurs applications frontales écrites pour lui.
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 soutenus par Redis , qui est omniprésent parmi les files d'attente de travail Node.js. Tous les 3 seraient capables de faire ce que fait DelayedJob de RoR, il s'agit de fonctionnalités spécifiques que vous souhaitez et de vos préférences API.
la source
Les travaux d'arrière-plan ne sont pas directement liés à votre travail de service Web, ils ne doivent donc pas être dans le même processus. Au fur et à mesure que vous augmentez, l'utilisation de la mémoire des travaux d'arrière-plan aura un impact 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 a le plus de sens.
Un bon choix pour la messagerie entre les deux processus serait redis , si laisser tomber un message de temps en temps est OK. Si vous voulez "aucun message laissé pour compte", vous aurez besoin d'un courtier plus lourd comme Rabbit . Votre processus de service Web peut publier et votre processus de travail en arrière-plan peut s'abonner.
Il n'est pas nécessaire que les deux processus soient co-hébergés, ils peuvent être sur des machines virtuelles distinctes, des conteneurs Docker, quoi que vous utilisiez. Cela vous permet d'évoluer sans trop de problèmes.
la source
Si vous utilisez MongoDB, je recommande Agenda . De cette façon, 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. L'interface utilisateur de l'agenda est facultative et peut être exécutée séparément, bien sûr.
Je recommande également de configurer une abstraction faiblement couplée entre la logique de votre application et le système de mise en file d'attente / de planification afin que l'ensemble du système de traitement en arrière-plan puisse être remplacé si nécessaire. En d'autres termes, gardez autant de logique d'application / de traitement loin de vos définitions de travail Agenda afin de les garder légères.
la source
Je voudrais suggérer d'utiliser Redis pour planifier des tâches. 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 mentionné RoR et DJ, donc je suppose que vous connaissez sidekiq. Vous pouvez utiliser node-sidekiq pour la planification des travaux si vous le souhaitez, mais son imo sous-optimal, car son objectif principal est d'intégrer nodejs avec RoR.
Pour la démonisation des ouvriers, je recommande d'utiliser PM2 . Il est largement utilisé et activement maintenu. Cela résout beaucoup de problèmes (par exemple, le déploiement, la surveillance, la mise en cluster), alors assurez-vous que ce ne sera pas excessif pour vous.
la source
J'ai essayé bee-queue & bull et j'ai finalement choisi bull. J'ai d'abord choisi bee-queue car c'est assez simple, leurs exemples sont faciles à comprendre, tandis que les exemples de taureaux sont un peu compliqués. bee's wiki L'origine de Bee Queue résonne également avec moi. Mais le problème avec bee est <1> que leur temps de résolution des problèmes est assez lent, leur dernière mise à jour remonte à 10 mois. <2> Je ne trouve pas de moyen simple de suspendre / annuler une tâche.
Bull, en revanche, met fréquemment à jour ses codes, en réponse aux problèmes. L'évaluation de la file d'attente de travaux de Node.js a déclaré que la faiblesse de Bull est "le temps de résolution des problèmes lent", mais mon expérience est le contraire!
Mais de toute façon, leur API est similaire, il est donc assez facile de passer de l'une à l'autre.
la source
Je suggère d'utiliser un cadre Node.js approprié pour créer votre application.
Je pense que le plus puissant et le plus facile à utiliser est Sails.js .
C'est un framework MVC donc si vous avez l'habitude de développer en ROR, vous le trouverez très très facile!
Si vous l'utilisez, il présente déjà un gestionnaire de travaux puissant (en termes javascript).
Si vous avez besoin de plus d'informations, n'hésitez pas à me contacter!
la source