Как реализовать парсинг в автономном режиме на RoR?
Задача реализовать автономный парсинг:
- есть многопользовательский сайт
- есть в профиле определенные настройки для каждого сайта
Необходимо с определенной периодичностью заходить на разные сайты (юзер нажимае "Старт") и собирать инфу (допустим раз в 5-10сек. в интервале 1-30 дней) и отображать ее в профиле пользователя, а также, принимать определенные действия если в запарсенных данных попалось определнное условия, до тех пор пока юзер не нажмет на "Стоп". Соответственно сохраненные настройки не должны сбрасываться после обновления страници или перезагрузки сервера.
Пробовал через Active Job. в итоге получаем одно задание. для всех пользователей и после ребута сервака оно сбрасывается.
Подскажите какие инструменты использовать для этой задачи и как это вообще реализовать. ну и желательно небольшой пример )
Active Job - всего лишь интерфейс. Ему нужен бекенд воркер, лучше использовать sidekiq. Должен быть установлен redis server.
whenever - умный интерфейс для крона,чтобы запускать Ваши задачи на парсинг по расписанию
Схема примерно следующая - раз в 30 секуннд с помощью whenever запускаете rake task который в свою очередь запускает ActiveJob планировщик. Этот планировщик выбирает всех пользователей, которым надо что-то парсить и для каждого такого пользователя запускает ActiveJob парсер.
Старт и Стоп - флаги в базе данных, в зависимости от которых планировщик добавит пользователя в парсинг или нет.
Если данные надо парсить каждые 5 секунд, то руби может быть не лучшим выбором.
Вадим, Запорожченко Олег очень грамотно вам ответил, но у вас будет проблема с тем, что бы запускать парсер каждые 5 секунд, с нагрузкой, с различными подводными камнями (в духе что делать если сайт отвечает дольше чем 5 секунд?)... подумайте ранее, может вы что то не так делаете? или много хотите? (дружеский совет)
что тогда лучше выбрать, если нужны данные каждые 5 сек.?
Строить пруф оф концепт.
0. Проверить, что это действительно актуальное требование прямо сейчас. Может Вам достатточно обновлять данные реже. Не в будущем, когда будет много клиентов и т.д. а прямо сейчас или тому подобное
1. Проверить, что целевой сайт способен отвечать на такое количество запросов так часто
2. Скедулинг должен отрабатывать максимаьно быстро
3. Так как мультипоточность в руби не настоящая, нужно будет запускать несколько процессов того же сайдкика, возможно на разных серверах. Продумывайте структуру так, чтобы это было небольшое отдельное приложение на руби, которому не надо поднимать вместе с собой всю рельсу, которая жрет 200-300 метров памяти на процесс
ActiveJob - это просто интерфейс, а дефолтовая имплементация, емнип, in-memory.
Попробуй поставь Sidekiq. Он хранит джобы в redis. Падение сервера, по-идее, не должно влиять.