2011-03-19 1 views
1

Dans une application Web de rails, si j'écris des messages dans une file d'attente comme rabbitmq, comment les clients seront-ils informés lorsqu'un producteur envoie un message à la file d'attente?en utilisant rabbitmq avec des rails, comment créer le processus de boucle sans fin?

Je suppose que je dois créer un processus séparé qui s'exécute en arrière-plan pour répondre aux messages corrects? c'est-à-dire que ce code est en dehors de la portée d'une application web.

Si tel est le cas, est-il possible de réutiliser les modèles/bibliothèques qui sont déjà dans l'application rails? dois-je copier ce code à 2 endroits alors?

+0

Un de mes amis utilise https://github.com/tobi/delayed_job pour effectuer des tâches d'arrière-plan. Je ne sais pas grand-chose à ce sujet (pas un dev de rails), mais peut-être regarder dedans? – notJim

Répondre

5

Il semble que votre application requiert ce qui est généralement appelé un processus d'arrière-plan ou travailleur. Ceci est une exigence assez commune pour toute application web modérément complexe.

Je suppose que je dois créer un processus séparé qui s'exécute en arrière-plan pour répondre aux messages corrects?

Oui, vous avez raison. Bien qu'il soit parfaitement possible d'utiliser des threads pour gérer les tâches d'arrière-plan (dans votre cas, lire et traiter les messages de RabbitMQ), l'itinéraire standard et recommandé pour une application Rails consiste à exécuter un processus d'arrière-plan séparé.

Si c'est le cas, est-il possible de réutiliser les modèles/bibliothèques qui sont déjà dans l'application rails?

Absolument. Le moyen le plus simple possible pour que cela fonctionne est d'utiliser le built in runner command de Rails.

Une autre option consiste à créer un script ruby ​​qui charge votre application Rails. Par exemple, vous pouvez créer le fichier my_script.rb dans la racine de votre projet, ce qui pourrait ressembler à ceci:

# Load my application: 
require File.join(File.dirname(__FILE__), 'config/environment.rb') 

# Now you can access your Rails environment as normal: 
MyModel.all.each { |x| x.do_something } 

Si vos besoins deviennent plus complexes, ou vous trouvez que vous devez exécuter plus d'un processus d'arrière-plan Pour suivre le volume de données que vous devez traiter, vous pouvez regarder l'un des many available libraries and frameworks qui peut vous aider. Une fois que vous avez créé votre processus d'arrière-plan, vous devez pouvoir l'exécuter en continu lorsque vous le déployez sur votre serveur de production.Bien qu'il soit possible d'utiliser des bibliothèques comme daemons, comme suggéré par ctcherry, je recommanderais d'utiliser un outil dédié tel que upstart (en cas de déploiement sur ubuntu) ou runit. Un bon résumé des options les plus populaires est available here.

+0

Oui Je suis intéressé par la création de plusieurs processus de travail, pas seulement un processus d'arrière-plan unique. – Blankman

0

Vous avez raison, vous avez besoin d'un processus d'arrière-plan. Et vous pouvez garder le code pour ce processus dans le dossier lib du projet Rails si vous le souhaitez, je l'ai fait avant sans problème, et il conserve le code associé, ce qui est agréable.

J'ai utilisé cette bibliothèque pour créer mon long processus en cours d'exécution, il est assez simple:

http://daemons.rubyforge.org/

Pour partir de votre application Rails modèles de re-utilisation, vous pouvez exécuter un require sur le fichier config/environment.rb à obtenir tout chargé. (Définissez RAILS_ENV en tant que variable d'environnement en premier pour sélectionner l'environnement correct.) A partir de ce point, le script se comporte comme si vous étiez dans une session de console de rails.

Questions connexes