Stalker/beanstalk обрабатывают задания асинхронно

Хорошо, я тестирую Stalker и Beanstalkd. Моя цель — разгрузить почтовые запросы на 500 КБ в очередь и обработать их асинхронно.

Пока в моем тестировании у меня есть этот очень простой пример.

#worker.rb
require 'stalker'
include Stalker

job 'hello' do |args|
  puts "hi"
  sleep 1
  puts "hello"
end

и этот файл для добавления в очередь

# stalker.rb
require 'rubygems'
require 'stalker'

10.times do 
    Stalker.enqueue('hello')
    puts 'queued'
end

Итак, в одном терминале я запускаю

$ stalk worker.rb
Работает 1 вакансии: [ привет ]

Потом запускаю сталкер файл

$ рубиновый stalker.rb

stalker выполняется почти мгновенно, как и ожидалось, поэтому никаких блокировок в этом нет.

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

Любые рекомендации по следующему лучшему шагу, чтобы сделать это?

ОБНОВЛЕНИЕ: я понял, что могу запускать несколько рабочих с разных терминалов, и это будет обрабатывать очередь намного быстрее, например. 2 рабочих выполнят процесс примерно в два раза быстрее.


person Derek Organ    schedule 14.11.2012    source источник


Ответы (2)


На заметку, вы можете проверить созданный мной новый гем под названием Backburner, который является более современный способ управления асинхронными заданиями с помощью beanstalkd в ruby. Он следует более чистому интерфейсу resque-esque, имеет действительно асинхронный рабочий процесс (который использует разветвление и несколько потоков для гораздо более высокой пропускной способности) и имеет гораздо лучшую обработку ошибок и поддержку повторных попыток. Я использовал stalker в течение 2 лет, прежде чем написать backburner, потому что хотел лучшего решения.

Это дает вам поддержку для таких вещей, как:

SomeObject.async(:pri => 1000, :delay => 2).some_method(1, 2, 3)

затем метод автоматически ставится в очередь на beanstalkd и обрабатывается асинхронно рабочими backburner.

person Nathan    schedule 15.11.2012

Stalker.enqueue принимает 3 параметра: строка имени задания, хэш аргументов, хэш параметров. в хэше опции вы можете указать количество секунд, которое требуется для запуска. пример:

Stalker.enqueue('hello',{},{:delay => 5})
person Rodrigo Dias    schedule 14.11.2012
comment
Сталкер предназначен для очередей. То есть он сразу берется за одну работу, насколько я знаю, это не паралель. возможно, вам стоит попробовать что-то еще. - person Rodrigo Dias; 14.11.2012
comment
согласно моему обновлению, похоже, что запуск нескольких рабочих делает что-то параллельно - person Derek Organ; 14.11.2012