2014-01-09 2 views
0

Я новичок в Rails и многопоточности, и мне любопытно, как достичь следующего в самом элегантном стиле. Я не нашел ни одного хорошего учебника, в котором подробно объяснялось, какое лучшее решение для решения для следующей задачи:Как создать рабочего демона, который ждет заданий и выполняет их?

У меня есть несколько HTTP-запросов, которые будут выполняться для пользователя в фоновом режиме, например, пару веб-сайтов и получить некоторую информацию, такую ​​как код ответа HTTP, время отклика, а затем вернуть результаты. По соображениям производительности я решил разделить общее количество URL-адресов для разбора в партии по 25 штук, затем выполнить каждую партию в потоке, объединить их и записать результат в базу данных.

Я решил использовать следующий драгоценный камень (http://rubygems.org/gems/thread), чтобы обеспечить максимальное количество потоков, которые запускаются одновременно. Все идет нормально.

Проблема состоит в том, что если два пользователя начинают свой анализ параллельно, максимальное количество потоков в два раза больше моего потока.

Мое решение (imho) - создать рабочего демона, который запускается самостоятельно и ждет заданий от клиентов.

Мой вопрос: какой лучший способ достичь этого в Rails?

Возможно, создать задачу Rake и использовать ее как демон (см. «Daemoninsing a rake task») и (как?) Добавить к ней задания?

спасибо, что заблаговременно!

ответ

0

Я построил очередь в таблице в базе данных и немного кода, который периодически запускается cron, который проходит эту таблицу, передавая запросы Typhoeus and Hydra.

Вот как автор суммирует камень:

Как современный код версии мифического зверя с 100 змеиными головами, Typhoeus запускает HTTP запросов параллельно в то время как чисто инкапсулирования логики обработки.

Поскольку пользователи добавляют запросы, добавьте их в таблицу. Вам понадобятся такие поля, как:

  • «Обработанное» поле, чтобы вы могли определить, какие из них были обработаны, если система опустилась.
  • Поле «успех», чтобы вы могли определить, какие запросы были обработаны успешно, поэтому вы можете повторить попытку, если они не удались.
  • Поле «retry_count», поэтому вы можете повторить попытку до «n» раз, а затем указать этот URL как недостижимый.
  • Поле «next_scan_time», которое указывает, когда URL-адрес должен быть отсканирован снова, чтобы вы не DOS-сайт, нажимая его постоянно.

Typhoeus и Hydra просты в использовании и позволяют легко обрабатывать несколько запросов.

+0

Hi Tin Man, это выглядит очень многообещающим. Я прочитаю это и дам вам обратную связь завтра! P.S .: Спасибо, что исправил/разъяснил мой плохой английский. :) – madhippie

+0

Я искал эту драгоценность и довольно доволен. Typhoeus и Hydra точно соответствуют моим требованиям! Большое спасибо. – madhippie

+0

Спасибо автору драгоценного камня. Это очень хороший инструмент. –

0

Существует множество библиотек для Rails, которые могут управлять очередями длительных фоновых заданий для вас. Вот некоторые из них:

  • Sidekiq использует Redis для хранения рабочих мест и поддерживает несколько рабочих потоков.
  • Resque также использует Redis и один рабочий поток.
  • delayed_job управляет очередью работы через ActiveRecord (или Mongoid).

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

+0

Спасибо за интересный вклад - я прочитаю его и дам вам обратную связь завтра. :) – madhippie

Смежные вопросы