33 votes

Meilleure pratique pour une application Rails pour exécuter une longue tâche en arrière-plan ?

J'ai une application Rails qui, malheureusement, après une requête à un contrôleur, doit faire des calculs qui prennent un certain temps. Quelles sont les meilleures pratiques dans Rails pour fournir un retour d'information ou une progression sur une tâche ou une requête de longue durée ? Ces méthodes de contrôleur durent généralement plus de 60 secondes.

Je ne suis pas concerné par le côté client... J'avais prévu d'avoir une requête Ajax toutes les secondes environ et d'afficher un indicateur de progression. Je ne suis pas sûr de la meilleure pratique de Rails, dois-je créer un contrôleur supplémentaire ? Y a-t-il quelque chose d'ingénieux que je puisse faire ? Je veux que les réponses se concentrent sur le côté serveur en utilisant uniquement Rails.

Merci d'avance pour votre aide.

Edit :

Si cela a de l'importance, les demandes http sont pour les PDFs. Je fais ensuite générer ces PDF par Rails en conjonction avec Ruport. Le problème est que ces PDF sont très volumineux et contiennent beaucoup de données. Est-il toujours utile d'utiliser une tâche d'arrière-plan ? Supposons qu'un PDF moyen prenne entre une et deux minutes, cela rendra-t-il mon application Rails insensible à toute autre requête du serveur pendant ce temps ?

Edit 2 :

Ok, après une enquête plus approfondie, il semble que mon application Rails ne réponde pas aux autres requêtes HTTP après qu'une demande de PDF volumineux ait été reçue. Donc, je suppose que la question devient maintenant : Quel est le meilleur mécanisme de filtrage/arrière-plan à utiliser ? Il doit être stable et entretenu. Je suis très surpris que Rails n'ait pas quelque chose comme ça intégré.

Edit 3 :

J'ai lu cette page : http://wiki.rubyonrails.org/rails/pages/HowToRunBackgroundJobsInRails . J'aimerais lire des articles sur les diverses expériences vécues avec ces outils.

Edit 4 :

J'utilise Passenger Phusion "modrails", si cela a de l'importance.

Edit 5 :

J'utilise Windows Vista 64 bits sur ma machine de développement, mais ma machine de production est Ubuntu 8.04 LTS. Devrais-je envisager de passer à Linux pour ma machine de développement ? Les solutions présentées fonctionneront-elles sur les deux ?

1voto

nitecoder Points 4561

Cela ressemble vraiment à quelque chose que vous devriez faire tourner en arrière-plan plutôt que de faire tourner une instance d'application (passenger/mongrel, peu importe ce que vous utilisez). De cette façon, votre application peut continuer à faire ce qu'elle est censée faire, c'est-à-dire répondre aux demandes, pendant qu'une tâche d'arrière-plan, Workling par exemple, s'occupe du calcul des chiffres. Je sais que cela n'aborde pas la question de la progression, mais à moins que cela ne soit absolument essentiel, je pense que c'est un petit prix à payer.

Vous pourriez demander à un utilisateur de cliquer sur l'action requise, faire en sorte que cette action transmette la demande à la file d'attente de Workling, et faire en sorte que cette dernière envoie une sorte de notification à l'utilisateur lorsqu'elle est terminée, peut-être un e-mail ou autre. Je ne suis pas sûr de l'aspect pratique de cette solution, je réfléchis juste à voix haute, mais ce que je veux dire, c'est qu'il semble vraiment que cela devrait être une tâche d'arrière-plan d'un certain type.

1voto

zetetic Points 29261

J'utilise Windows Vista 64 bits pour ma machine de développement. machine de développement ; cependant, mon machine de production est Ubuntu 8.04 LTS. Devrais-je envisager de passer à Linux pour ma machine de développement ? Est-ce que les solutions présentées fonctionneront-elles sur les deux ?

Avez-vous envisagé d'exécuter Linux dans une VM au-dessus de Vista ?

1voto

scaryguy Points 1498

Je recommande d'utiliser Resque pierre précieuse avec son resque-status pour vos processus d'arrière-plan lourds.

Resque

Resque est une bibliothèque Ruby soutenue par Redis pour créer des tâches en arrière-plan, les placer sur plusieurs files d'attente, et les traiter plus tard.

État des lieux de la situation

resque-status est une extension au système de file d'attente resque qui fournit des des travaux simples pouvant être suivis.

Une fois que vous aurez exécuté une tâche sur un travailleur Resque à l'aide de l'extension resque-status, vous pourrez obtenir des informations sur les progrès en cours et la possibilité de tuer un processus spécifique très facilement. Voir les exemples :

status.pct_complete #=> 0
status.status #=> 'queued'
status.queued? #=> true
status.working? #=> false
status.time #=> Time object        
status.message #=> "Created at ..."

De plus, resque et resque-status disposent d'une interface web pour interagir avec vos emplois, ce qui est vraiment cool.

0voto

salt.racer Points 4715

Il y a le tout nouveau Growl4Rails ... c'est pour ce cas d'utilisation spécifique (parmi d'autres également).

http://www.writebetterbits.com/2009/01/update-to-growl4rails.html

0voto

Kyle Boon Points 2452

J'utilise Background Job ( http://codeforpeople.rubyforge.org/svn/bj/trunk/README ) pour planifier les tâches. Je suis en train de construire un petit site d'administration qui permet aux administrateurs de sites d'exécuter toutes sortes de choses que vous et moi exécuterions en ligne de commande à partir d'une interface web agréable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X