Статьи

Положите свою работу в ку

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

Фон на Ку

Что такое Ку? Как и все хорошие проекты, README дает хорошее описание:

Qu — библиотека Ruby для организации очередей и обработки фоновых заданий. Это сильно вдохновлено delayed_job и Resque.

Брэндон Хранители создал Qu, чтобы преодолеть недостатки существующих библиотек очередей, помогая в разработке Harmony , Gaug.es и SpeakerDeck в Ordered List .

Вот некоторые из недостатков, которые Ку пытается преодолеть:

  • Тихая неудача
    • некоторые существующие решения потерпят неудачу, и вы никогда не узнаете об этом.
  • Единый персистентный бэкэнд
    • будучи рассчитанным только на один постоянный бэкэнд, ограничивает среду, в которой может использоваться библиотека очередей. (например, комбинация Resque / Redis)
  • Работа выполняется несколько раз
    • Некоторые библиотеки очередей продемонстрировали конфликт в ActiveRecord, который позволял запускать одно задание нескольким работникам.

Есть несколько других проблем, изложенных в README совсем недавно в блоге Брэндона.

Помимо стремления решить эти проблемы, Ку будет требовать работы, когда работник убит, поэтому никакие работы не будут потеряны. Кроме того, если вы знакомы с Resque, вы заметите, что у Qu есть «похожий на Resque» API, который может помочь вам в переходе.

Silent Fail

Когда работа выполняется, как вы справляетесь со сбоями? Куда идут исключения? Некоторые библиотеки просто ничего не делают, в то время как другие регистрируют ошибку. Когда Qu выполняет задание, он поймает исключение любого типа и зарегистрирует его в коллекции «сбоев» в базе данных. Это удобная функция, но она не должна быть вашим единственным методом обработки ошибок.

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

Как только ловушки будут готовы, обработка ошибок, возникающих при выполнении задания, станет проще и понятнее для реализации.

Единый бэкэнд персистентности

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

Qu имеет API, который абстрагирует бэкэнд персистентности, что позволяет использовать многие решения для персистентности. Начиная с версии 0.1.3, Qu имеет встроенную поддержку Redis и MongoDB. Позже в этой статье вы узнаете больше о том, что Брэндон, автор Qu, думает о будущем поддержки дополнительных бэкэндов персистентности.

Вакансии выполнены один раз

Одна из проблем, которую пытается решить, — это вероятность конфликта, который может возникнуть, когда несколько сотрудников получают доступ к базе данных. Брэндон заметил эту проблему с ActiveRecord и решил исправить ее в Qu. Команды LPOP и BLPOP используются с бэкэндом Redis, когда рабочие получают задания. Такое же поведение достигается с MongoDB с помощью операции findAndModify .

Образец

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

class ScrapeWebsite @queue = :data # not required, defaults to :default def self.perform(url) results = url.scrape results.save end end # queue the job job = Qu.enqueue ScrapeWebsite, "http://github.com" 

Из командной строки вы можете запустить работника для обработки любых заданий в очереди «данных».

 $ bundle exec rake qu:work QUEUES=data 

Довольно просто, правда? Одна вещь, которую вы заметите, заключается в том, что ваша «работа» должна иметь только метод класса с именем execute (аналогично delayed_job). Скорее всего, это изменится в будущей версии Qu (текущая версия 0.1.3) для поддержки хуков и других функций. Цель хуков состоит в том, чтобы позволить разработчикам «подключиться» к жизненному циклу работы (до, после и т. Д.).

Кроме того, если вы развернете приложения в Heroku, Qu готов к этому. Он может легко подключиться к MongoDB с помощью переменной среды MONGOHQ_URL . Точно так же Qu может подключиться к Redis с помощью переменной окружения REDISTOGO_URL ! S

Интервью с Брэндоном

Брэндон был достаточно хорош, чтобы немного пообщаться со мной через GitHub.

Есть ли планы добавить другие персистентные бэкэнды?

По крайней мере, я хотел бы увидеть общий SQL-сервер. Специфичный для PostgreSQL бэкэнд, основанный на queue_classic Райана Смита, был бы довольно крутым. У меня нет других на радаре, но я думаю, что есть большой потенциал для другого творческого использования.

Есть ли планы добавить планирование? (т.е. запускать эту работу каждый час)

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

Какова дорожная карта для Qu (например, чтобы добраться до 1.0)?

Еще предстоит проделать большую работу над некоторыми базовыми функциями, которые мы узнали и полюбили из других систем массового обслуживания (хуки, плагины, статистика) и, конечно же, великолепный веб-интерфейс. Вещи, которые находятся на моем ближайшем радаре, перечислены в GitHub Issues: https://github.com/bkeepers/qu/issues .

Я начал работу над хуками , что станет важным шагом к созданию хорошего плагина API. Для поддержки хуков я внес некоторые изменения в определение заданий. Я действительно взволнован идеей, что рабочие места — более богатый объект, чем метод классового подхода, который использует resque.

Что-нибудь еще, что вы хотели бы упомянуть?

Уже было несколько разветвлений и запросов на извлечение информации, но я хотел бы, чтобы к ним присоединилось больше людей.

Вывод

Qu — еще один инструмент для обработки заданий в фоновом режиме, который имеет некоторые интересные функции и чистый API. Это все еще в начале проекта, который хорош и плох. Хорошо, потому что легко получить помощь, оставить отзыв и внести свой вклад! Конечно, поскольку он «молодой», наверняка будут ошибки (которые есть у всех программ), меняющийся API и потенциально недостающие функции.

Вы использовали другие библиотеки очередей и обработки заданий? Если да, то какие? Какой вы выбрали и почему?