Delayed_jobs vs resque vs beanstalkd?

Вот мои потребности:

  • Enqueue_in (10.hours,...) (синтаксис DJ идеален.)
  • Умножить работников одновременно. (Resque или beanstalkd хороши для этого, но не DJ).
  • Должен обрабатывать push и pop из 100 заданий в секунду. (Мне нужно будет запустить тест, чтобы убедиться, но я думаю, что DJ не может справиться с этим множеством заданий)

Resque и beanstalkd не делают enqueue_in.

Есть плагин (resque_scheduler), который делает это, но я не уверен, насколько он стабилен.

Наша среда находится на амазонке, и они бесплатно выкатили beanstalkd для тех, у кого есть амазонки, это плюс для нас, но я все еще не уверен, что здесь лучший вариант.

Мы запускаем рельсы 2.3, но скоро приносим его к рельсам 3.0.3.

Но какой у меня лучший выбор? Я пропустил еще один камень, который лучше справляется с этой работой?

Я чувствую, что мой единственный вариант, который на самом деле работает сейчас, - resque_scheduler.

Изменить:

Sidekiq (https://github.com/mperham/sidekiq) - еще один вариант, который вы должны проверить.

Ответ 1

Для моих проектов я буду чувствовать себя очень комфортно с помощью collectiveidea/delayed_job в rails2 и 3. Я не знаю, beanstalkd, но я попробую скоро:-). Я следил за предложениями в документах resque. Я сообщу об этом.

Resque vs DelayedJob

Как Resque сравнивается с DelayedJob, и почему вы выбираете один из них?

  • Resque поддерживает несколько очередей
  • DelayedJob поддерживает более мелкие приоритеты
  • Работники Resque устойчивы к утечке памяти/раздуванию
  • Работники DelayedJob чрезвычайно просты и легко модифицируются
  • Resque требует Redis
  • DelayedJob требует ActiveRecord
  • Resque может помещать объекты JSONable Ruby в очередь в качестве аргументов
  • DelayedJob может поместить любой объект Ruby в свою очередь в качестве аргументов
  • Resque включает приложение Sinatra для мониторинга того, что происходит.
  • DelayedJob может быть запрошен из вашего приложения Rails, если вы хотите добавить интерфейс

Если вы разрабатываете Rails, у вас уже есть база данных и ActiveRecord. DelayedJob очень прост в настройке и отлично работает. GitHub использовал его в течение многих месяцев для обработки почти 200 миллионов рабочих мест.

Выберите Resque, если:

  • Вам нужно несколько очередей
  • Вам не нужны/не нравятся числовые приоритеты
  • Вам не нужно постоянно сохранять каждый объект Ruby
  • У вас потенциально огромные очереди
  • Вы хотите посмотреть, что происходит.
  • Вы ожидаете много неудач/хаоса
  • Вы можете настроить Redis
  • У вас недостаточно оперативной памяти.

Выберите DelayedJob, если:

  • Вам нравятся числовые приоритеты
  • Вы не выполняете гигантское количество заданий каждый день.
  • Ваша очередь остается маленькой и проворной.
  • Не так много сбоев/хаоса
  • Вы хотите легко выбросить все в очередь
  • Вы не хотите устанавливать Redis

Выберите Beanstalkd, если:

  • Вам нравятся числовые приоритеты
  • Вам нужна очень быстрая очередь
  • Вы не хотите тратить впустую RAM.
  • Вы хотите выполнять большое количество заданий
  • Все в порядке с объектами JSONable Ruby в очереди в качестве аргументов
  • Вам нужно несколько очередей

Никоим образом не Resque "лучше" DelayedJob, поэтому убедитесь, что вы выбираете инструмент, который лучше всего подходит для вашего приложения.

Хорошее сравнение скорости работы в очереди:

                 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

Приятного дня!

P.S. Существует RailsCast о resque, Отложенное задание (измененная версия) и Beanstakld. Посмотрите!

P.P.S. Мой любимый выбор теперь Sidekiq (очень простой, быстрый и эффективный для простых заданий), посмотрите эту страницу для сравнения.

Ответ 2

Amazon Beanstalk не Beanstalkd.

Beanstalkd - очередь - имеет задержанные задания, которые не будут зарезервированы из очереди до тех пор, пока не пройдет заданное количество секунд. Если это то, что означает Enqueue_in(10.hours, ... ), то это просто синтаксический сахар, чтобы рассчитать количество секунд и не делать работу до тех пор.

Ответ 3

Небольшое примечание: delayed_job 3.0+ поддерживает именованные очереди

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