2010-12-15 138 views
1

Je travaille sur une application Rails 2.3.x qui doit exécuter une tâche longue et lente de manière asynchrone.Exécution de tâches lentes de manière asynchrone dans Rails?

Retarder la demande jusqu'à ce que le traitement terminé est un peu une douleur. Nous sommes heureux d'envoyer un «Okay, nous avons reçu cela et nous travaillons dessus» réponse de type au client, puis juste croquer sur le travail une fois que le client est parti.

J'ai vu quelques méthodes pour ce faire (comme bifurquer ou en utilisant Cron), mais il semble peut-être une meilleure idée que les systèmes de mise en attente des tâches.

Il semble que les trois principaux sont:

Sparrow semble particulièrement intéressante en raison de son soutien à Memcached, mais je Je ne veux pas en choisir un sans prendre une décision éclairée. Quelqu'un a-t-il des idées sur les meilleures pratiques? J'aimerais entendre parler de vos expériences avec ce qui précède, en particulier les principales découvertes avec cette approche ou les bibliothèques mentionnées. Peut-être y a-t-il une meilleure façon de faire cela que j'ai complètement ratée?

Pour que ce soit là-bas: Rails 3.x est pas une option en ce moment, cela doit travailler pour Rails 2.3.x.

Merci!

+3

Essayez aussi: [navvy] (https://github.com/jeffkreeftmeijer/navvy) et [delayed_job] (https://github.com/tobi/delayed_job) ont une bonne expérience avec eux, mais pas d'idées spéciales – iain

+0

Vous pouvez toujours écrire les vôtres. Dans mon expérience, ce faisant, vous comprendrez mieux votre propre problème et la solution, et il fera exactement ce dont vous avez besoin. Il est mieux de passer du temps à lire les solutions d'autres personnes à leurs propres problèmes légèrement différents. – maerics

Répondre

1

Je recommande delayed_job, en particulier this fork and branch. Je l'utilise moi-même sur les rails 2.3.5 et ça marche bien.

Il a un rails 3 branche lorsque vous ne voulez mettre à jour, il travaille avec plusieurs backends, et il a une syntaxe assez optionnelle:

Notifier.delay.deliver_signup @user 

Soit dit en passant, juste bifurquer est une erreur que vous Je vais trouver que la fourche n'a pas une bonne connexion à la base de données.

+0

Hey, merci pour la perspicacité. :) Une raison particulière pour aller avec 2.0.0 sur 2.0.5? –

+0

La branche à laquelle je suis lié est pour les rails 2 et a les versions 2.0.x, donc utilisez la dernière version - actuellement 2.0.5. Si vous utilisez bundler (good move), vous pouvez spécifier la dernière version de la série 2.0.x en disant "gem delayed_job, '~> 2.0.5'" qui correspondra à 2.0.6, 2.0.12 etc. – gunn