web-dev-qa-db-fra.com

delay_jobs vs resque vs beanstalkd?

Voici mes besoins:

  • Enqueue_in (10. heures, ...) (la syntaxe DJ est parfaite.)
  • Multipliez les travailleurs simultanément. (Resque ou beanstalkd sont bons pour cela, mais pas DJ)
  • Doit gérer Push and pop de 100 tâches par seconde. (Je devrai faire un test pour m'en assurer, mais je pense que DJ ne peut pas gérer autant de tâches)

Resque et beanstalkd ne font pas l'enqueue_in.

Il existe un plugin (resque_scheduler) qui le fait, mais je ne suis pas sûr de sa stabilité.

Notre environnement est sur Amazon, et ils ont déployé le beanstalkd gratuitement pour ceux qui ont des instances Amazon, c'est un plus pour nous, mais je ne sais toujours pas quelle est la meilleure option ici.

Nous lançons Rails 2.3 mais nous l’accélérons à Rails 3.0.3 bientôt).

Mais quel est mon meilleur choix ici? Me manque-t-il un autre joyau qui fait mieux ce travail?

Je pense que ma seule option qui fonctionne actuellement est le resque_scheduler.

Éditer:

Sidekiq ( https://github.com/mperham/sidekiq ) est une autre option que vous devriez vérifier.

64
rafamvc

Pour mes projets, je me sentirai très à l'aise avec collectiveidea/delay_job dans Rails2 et 3. Je ne connais pas beanstalkd, mais je vais l'essayer bientôt :-). J'ai suivi les suggestions dans la documentation de resque. Je vais le signaler.

Resque vs DelayedJob

Comment Resque se compare-t-il à DelayedJob et pourquoi choisiriez-vous l'un plutôt que l'autre?

  • Resque prend en charge plusieurs files d'attente
  • DelayedJob prend en charge des priorités plus fines
  • Les travailleurs de Resque résistent aux fuites de mémoire/ballonnements
  • Les travailleurs DelayedJob sont extrêmement simples et faciles à modifier
  • Resque nécessite Redis
  • DelayedJob nécessite ActiveRecord
  • Resque peut uniquement placer des objets JSONable Ruby dans une file d'attente comme arguments
  • DelayedJob peut placer n'importe quel objet Ruby dans sa file d'attente comme arguments
  • Resque comprend une application Sinatra pour surveiller ce qui se passe
  • DelayedJob peut être interrogé à partir de votre application Rails si vous souhaitez ajouter une interface

Si vous faites le développement Rails, vous avez déjà une base de données et ActiveRecord. DelayedJob est super facile à configurer et fonctionne très bien. GitHub l'a utilisé pendant plusieurs mois pour traiter près de 200 millions de travaux.

Choisissez Resque si:

  • Vous avez besoin de plusieurs files d'attente
  • Vous ne vous souciez pas/n'aiment pas les priorités numériques
  • Vous n'avez pas besoin de persister chaque Ruby objet jamais
  • Vous avez des files d'attente potentiellement énormes
  • Vous voulez voir ce qui se passe
  • Vous attendez beaucoup d'échecs/chaos
  • Vous pouvez configurer Redis
  • Vous ne manquez pas de RAM

Choisissez DelayedJob si:

  • Vous aimez les priorités numériques
  • Vous ne faites pas un nombre gigantesque de tâches chaque jour
  • Votre file d'attente reste petite et agile
  • Il n'y a pas beaucoup d'échec/chaos
  • Vous voulez jeter facilement n'importe quoi dans la file d'attente
  • Vous ne voulez pas configurer Redis

Choisissez Beanstalkd si:

  • Vous aimez les priorités numériques
  • Vous voulez une file d'attente extrêmement rapide
  • Vous ne voulez pas gaspiller votre RAM
  • Vous souhaitez occuper un grand nombre d'emplois
  • Vous êtes bien avec JSONable Ruby objets sur une file d'attente comme arguments
  • Vous avez besoin de plusieurs files d'attente

Resque n'est en aucun cas un "meilleur" DelayedJob, alors assurez-vous de choisir l'outil qui convient le mieux à votre application.

Une comparaison sympa de la vitesse du backend de mise en file d'attente :

                 enqueue                work
-------------------------------------------------
delayed job |   200 jobs/sec     120 jobs/sec
resque      |  3800 jobs/sec     300 jobs/sec
rabbitmq    |  2500 jobs/sec    1300 jobs/sec
beanstalk   |  9000 jobs/sec    5200 jobs/sec

Bonne journée!

P.S. Il y a un RailsCast à propos de resque , Travail retardé ( version révisée ) et Beanstakld . Regarde!

P.P.S. Mon choix préféré est maintenant Sidekiq (très simple, rapide et efficace pour les travaux simples), jetez un œil à cette page pour comparaison .

137
andrea

Amazon Beanstalk n'est pas Beanstalkd.

Beanstalkd - la file d'attente - a des travaux retardés, qui ne seront pas réservés hors de la file d'attente jusqu'à ce que le nombre de secondes donné se soit écoulé. Si c'est ce que Enqueue_in(10.hours, ... ) signifie, alors c'est juste du sucre syntaxique pour calculer le nombre de secondes, et ne pas rendre un travail disponible jusque-là.

8
Alister Bulman

Juste une petite note: delay_job 3.0 + prend en charge les files d'attente nommées

object.delay(:queue => 'tracking').method    
Delayed::Job.enqueue job, :queue => 'tracking'    
handle_asynchronously :Tweet_later, :queue => 'tweets'
8
altuure