#ruby-on-rails #performance #cron #rake
#ruby-on-rails #Производительность #cron #rake
Вопрос:
Я хочу запускать задачу cron rake при каждом обновлении записи — т.Е. Через некоторое время после создания / обновления новой записи задача cron rake выполнит некоторую обработку записи и сохранит результаты.
Однако эта задача требует больших затрат процессора, и имеет смысл запускать ее только тогда, когда запись обновляется пользователем.
Каков наилучший способ программно определить, обработала ли задача rake уже определенную запись (и пользователь вообще ее не изменял)?
Я подумываю о том, чтобы сгенерировать хэш для каждой записи и использовать его, чтобы увидеть, изменилась ли она. Должен быть более эффективный способ выполнить это.
Спасибо за помощь, Алекс
Ответ №1:
Я думаю, вам следует использовать DelayedJob, а не Cron / Whenever.
В любом случае, вам не кажется, что было бы лучше сделать это при проверке или как до / после сохранения фильтра? Если бы вы реализовали эту функциональность как фильтр before_save, тогда вы могли бы использовать грязные атрибуты. Больше о грязных атрибутах вы можете найти здесь: http://ryandaigle.com/articles/2008/3/31/what-s-new-in-edge-rails-dirty-objects
Комментарии:
1. Спасибо за ваш ответ. Я не уверен, что грязные атрибуты справятся с этой задачей, я приведу вам пример (см. Ниже):
2. Пользователи могут настроить внешний вид «страниц» — например, изменить цвета. Фоновое задание должно сделать снимок этой страницы, используя внешний API. Я могу запускать эту задачу с отложенным заданием после каждого обновления, но пользователи могут протестировать множество цветовых комбинаций, прежде чем остановиться на одной. Если я использую DJ, мое приложение вызовет несколько фоновых заданий, что сильно усложнит ситуацию. Я подумал, что наиболее эффективный подход — запускать запланированную задачу каждые 3-4 часа, проверять наличие обновлений в записи, а затем запускать задачу. Если запись не изменилась, пропустите все задание, поскольку оно уже было запущено. Есть идеи?