bogdan_uman
@bogdan_uman
шлЫмазл неукЪ-поцЪ

Периодически выполнять задачу?

Здравствуйте. Подскажите пожалуйста. Как правильно мне решить данную задачу. Нужно http запросом вытянуть данные с сайта, и сохранить их в БД. Это реализовано, но как бы вопрос в том что это нужно делать каждую минуту?
Как бы использовать gem whenewer, тогда получается при частых запросах когда один в процессе выполнение, а другой начался, могут быть проблемы с блокировками?
Посоветовали треды, вроде через gem 'cuncurrent-ruby' Concurrent::TimerTask, но тут как бы если встраивать в рельсовое приложение, тогда будет стартовать на каждый Worker свой тред. А если писать отдельное, то непонятно как лучше все это сделать?
Подскажите, может кто-то подобное реализовывал?
  • Вопрос задан
  • 105 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Mox
Team Lead, RoR, React/React Native
Тут есть некоторая путаница

Через cron запускаются процессы, а не потоки, поэтому проблем с блокировками быть недолжно, ведь каждый запуск - это свой процесс со своим адресным пространством. Могут быть проблемы с целостностью данных в БД.

Теперь про реализацию:

Такое лучше делать через сервис очередей вроде sidekiq.

Как это работает?

Через API sidekiq можно положить задачу в очередь ( в том числе класть можно и раз в минуту, это можно указать в config), параметры запуска хранятся в redis (который нужно будет поставить на production). Очередь задач парсинга нужно настроить на 1 поток выполнения.

Дальше sidekiq, болтаясь отдельным процессом помимо rails, берет просто самую верхнюю задачу из очереди и выполняет ее.

Таким образом, если парсинг больше минуты - просто увеличивается длинна очереди. Эту величину стоит мониторить, но если она разрастется - катастрофы не будет.

Можно делать, наверное, и через ActiveJob и в основной БД - Rails, я еще не смотрел нововведения про это.
Ответ написан
HighQuality
@HighQuality
☁ Ниндзя девелопер
Крон добавляет задачу в очередь. Задача в очереди должна занимать как можно меньше времени.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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