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 ?

0voto

srboisvert Points 7214

Je sais que vous avez dit que vous n'étiez pas préoccupé par le côté client, mais j'ai pensé que cela pourrait vous intéresser : Growl4Rails - Des notifications de type Growl qui ont été développées pour ce que vous faites à en juger par l'exemple qu'elles utilisent.

0voto

Orion Edwards Points 54939

J'ai utilisé se reproduire avant et je le recommande sans hésiter.

Incroyablement simple à mettre en place (ce que beaucoup d'autres solutions ne sont pas), et qui fonctionne bien.

0voto

Ken Liu Points 7779

Vérifiez BackgrounDRb Il est conçu exactement pour le scénario que vous décrivez.

Je pense qu'il existe depuis un certain temps et qu'il est assez mature. Vous pouvez suivre le statut des travailleurs.

C'est une bonne idée de développer sur la même plateforme de développement que votre environnement de production, surtout lorsque vous travaillez avec Rails. La suggestion d'exécuter Linux dans une VM est bonne. Consultez Sun xVM pour les logiciels de virtualisation Open Source.

0voto

J'utilise personnellement le plugin active_messaging avec un serveur activemq (protocole stomp ou rest). Cela a été extrêmement stable pour nous, traitant des millions de messages par mois.

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