Как реализовать парсинг в автономном режиме на RoR?

Задача реализовать автономный парсинг:
- есть многопользовательский сайт
- есть в профиле определенные настройки для каждого сайта
Необходимо с определенной периодичностью заходить на разные сайты (юзер нажимае "Старт") и собирать инфу (допустим раз в 5-10сек. в интервале 1-30 дней) и отображать ее в профиле пользователя, а также, принимать определенные действия если в запарсенных данных попалось определнное условия, до тех пор пока юзер не нажмет на "Стоп". Соответственно сохраненные настройки не должны сбрасываться после обновления страници или перезагрузки сервера.
Пробовал через Active Job. в итоге получаем одно задание. для всех пользователей и после ребута сервака оно сбрасывается.
Подскажите какие инструменты использовать для этой задачи и как это вообще реализовать. ну и желательно небольшой пример )

использую Rails 5.1.3, RubyMine, Win 7
  • Вопрос задан
  • 151 просмотр
Решения вопроса 1
c3gdlk
@c3gdlk
Ментор в http://rubyboost.ru/
Active Job - всего лишь интерфейс. Ему нужен бекенд воркер, лучше использовать sidekiq. Должен быть установлен redis server.
whenever - умный интерфейс для крона,чтобы запускать Ваши задачи на парсинг по расписанию

Схема примерно следующая - раз в 30 секуннд с помощью whenever запускаете rake task который в свою очередь запускает ActiveJob планировщик. Этот планировщик выбирает всех пользователей, которым надо что-то парсить и для каждого такого пользователя запускает ActiveJob парсер.

Старт и Стоп - флаги в базе данных, в зависимости от которых планировщик добавит пользователя в парсинг или нет.

Если данные надо парсить каждые 5 секунд, то руби может быть не лучшим выбором.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@unabl4
ruby on rails web dev
ActiveJob - это просто интерфейс, а дефолтовая имплементация, емнип, in-memory.
Попробуй поставь Sidekiq. Он хранит джобы в redis. Падение сервера, по-идее, не должно влиять.
Ответ написан
Комментировать
@pasystem
Веб разработчик
Попробуйте гем https://github.com/jmettraux/rufus-scheduler
В свое время нужно было действия выполнять каждые 5 сек, решил мою задачу.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы