delay_jobs vs resque vs beanstalkd?

Voici mes besoins:

  • Enqueue_in (10.hours, …) (la syntaxe DJ est parfaite.)
  • Multiplier les travailleurs, en même temps. (Resque ou beanstalkd sont bons pour cela, mais pas pour DJ)
  • Doit gérer le push et le pop de 100 emplois par seconde. (Je devrai faire un test pour être sûr, mais je pense que DJ ne peut pas gérer autant d’emplois)

Resque et beanstalkd ne font pas la queue_in.

Il y a 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 lancé gratuitement le beanstalkd pour ceux qui ont des cas amazoniens, c’est un avantage pour nous, mais je ne suis toujours pas sûr de la meilleure option.

Nous courons les rails 2.3 mais nous l’amènerons rapidement aux rails 3.0.3.

Mais quel est mon meilleur choix ici? Est-ce que je manque un autre joyau qui fait ce travail mieux?

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

Modifier:

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

Pour mes projets, je me sentirai très à l’aise avec collectiveidea / delay_job in rails2 et 3. Je ne connais pas beanstalkd, mais je vais 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 sur l’autre?

  • Resque prend en charge plusieurs files d’attente
  • DelayedJob soutient des priorités plus fines
  • Les travailleurs de Resque sont résistants aux memory leaks
  • Les employés de DelayedJob sont extrêmement simples et faciles à modifier
  • Resque nécessite Redis
  • DelayedJob nécessite ActiveRecord
  • Resque ne peut placer que des objects JSONable Ruby dans une queue comme arguments
  • DelayedJob peut placer n’importe quel object Ruby dans sa queue comme arguments
  • Resque comprend une application Sinatra pour surveiller ce qui se passe
  • DelayedJob peut être interrogé depuis votre application Rails si vous souhaitez append une interface

Si vous développez Rails, vous avez déjà une firebase database et ActiveRecord. DelayedJob est très facile à configurer et fonctionne très bien. GitHub l’a utilisé pendant plusieurs mois pour traiter près de 200 millions d’emplois.

Choisissez Resque si:

  • Vous avez besoin de plusieurs files d’attente
  • Vous ne vous souciez pas / n’aime pas les priorités numériques
  • Vous n’avez pas besoin de persister chaque object Ruby
  • Vous avez des files d’attente potentiellement énormes
  • Vous voulez voir ce qui se passe
  • Vous vous attendez à beaucoup d’échec / chaos
  • Vous pouvez configurer Redis
  • Vous n’êtes pas à court de RAM

Choisissez DelayedJob si:

  • Vous aimez les priorités numériques
  • Vous ne faites pas une quantité gigantesque d’emplois chaque jour
  • Votre queue rest petite et agile
  • Il n’y a pas beaucoup d’échec / chaos
  • Vous voulez facilement jeter quelque chose dans la queue
  • Vous ne voulez pas configurer Redis

Choisissez Beanstalkd si:

  • Vous aimez les priorités numériques
  • Vous voulez une queue extrêmement rapide
  • Vous ne voulez pas vous gaspiller de RAM
  • Vous voulez servir un grand nombre d’emplois
  • Vous êtes bien avec les objects JSONable Ruby dans une queue 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 le mieux adapté à votre application.

Une belle comparaison de la vitesse de backend des files 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!

PS Il y a un RailsCast sur resque , Delayed Job ( version révisée ) et Beanstakld . Regarde!

PPS Mon choix préféré est maintenant Sidekiq (très simple, rapide et efficace pour les travaux simples), regardez cette page pour la comparaison.

Amazon Beanstalk n’est pas Beanstalkd.

Beanstalkd – la queue – a des tâches différées, qui ne seront pas réservées en dehors de la queue tant que le nombre de secondes spécifié n’est pas écoulé. Si c’est ce que signifie Enqueue_in(10.hours, ... ) , alors ce n’est que du sucre syntaxique pour calculer le nombre de secondes et ne pas rendre un travail disponible jusque-là.

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'