Пишем воркеры на ruby быстро и легко
Имея некоторый опыт написания воркеров на ruby, искренне хочется им поделится с другими.
Начнем с того что такое воркер и для чего он нужен.
Иногда при создание какой либо информационной системы возникает потребность запустить какой либо код по расписанию или запустить тяжелый участок кода. При этом наше приложение должно быстро отвечать на запросы другим клиентам.
Примеры таких ситуаций:
- найти всех покупателей в большой базе данных которые что либо положили сегодня в корзину, но не оформили заказ и отправить им письмо напоминание
- сформировать отчет о состояние системы за весь текущий день
- посчитать статистику за сегодняшний день и сохранить ее в отдельную таблицу в базе
- запустить выгрузку информации из системы в xls/csv-файл
- импорт информации в систему из сторонней системы или из стороннего файла
С решением этих задач отлично справляются воркеры.
WHENEVER
Для записей задач по расписанию существует гем whenever.
Работать с ним очень легко, после установки гема остается записать все отложенные задачи в файл с расписанием schedule.rb
Пример файла:
DELAYED JOB
Следующий полезный гем это delayed_job.
Любую тяжелую для выполнения функцию можно делегировать на выполнение ему. Этот гем работает по следующему алгоритму:
- Любой тяжелый для выполнениям метод делегируем ему через метод delay.
- Рельса сохраняет код который нужно выполнить в отдельную таблицу в БД.
- Воркер анализируя текущую загруженность сервера, запускает поочередно необходимые задачи.
- При этом пишет логи о удачном или неудачном выполнении команд.
Но не забывайте что при его использовании, кроме запуска рельсы, на сервере нужно запустить отдельный процесс-воркер.
Delayed_jobs очень полезный гем который я рекомендую.
DELAYED JOBS RECURRING
На случай если нужно запускать тяжелые задачи по расписанию и при этом хочется использовать delayed_job, можно написать воркер при помощи гема delayed_jobs_recurring.
Этот гем позволяет достаточно удобно написать воркер и настроить для него расписание.
Пример воркера
Для инициализации воркера нужно лишь написать следующее.
Вот так быстро и удобно можно писать и применять воркеры в своем приложении.