Я использую twitter gem (оболочку Ruby, для API Twitter) в мое приложение, которое запускается на Heroku. Я использую Heroku's Scheduler, чтобы периодически запускать задачи кэширования, которые используют твиттер, чтобы, например, обновить список ретвитов для определенного пользователя. Я также использую delayed_job, поэтому планировщик вызывает задачу рейка, которая вызывает метод «delayed» (см. Scheduler.rake ниже). Этот метод проходит через «аутентификации» (для пользователей, прошедших проверку подлинности через мое приложение), чтобы обновить кеш-ретвит в каждом авторизованном пользователе в приложении.
Мой вопрос
Что я делаю неправильно ? Например, поскольку я использую планировщик Heroku, избыточность delayed_job? Кроме того, вы можете видеть, что я не ловил (спасая) любые ошибки. Итак, если Twitter недоступен, или если токен авторизации пользователя истек, все задыхается. Это очевидно глупо и страшно, потому что, если есть ошибка, вся штука задыхается и заканчивается тем, что создает неудавшееся delayed_job, что вызывает эффект пульсации для моего приложения. Я вижу, что это плохо, но я не уверен, какое лучшее решение. Как/где я должен ловить ошибки?
Я поместил весь свой код (от планировщика до вызываемого метода) для одного из моих методов кэширования. Я действительно надеюсь, что для маркированного списка (и, возможно, кода или псевдокода) я буду ругать меня за плохую практику кодирования и сказать, где я могу улучшить ситуацию.
Я видел this SO question, что немного помогает мне с блоком начала и спасения, но я мог бы использовать больше рекомендаций по ошибкам ловушки, а один более высокий уровень «это хороший способ сделать это?». самолет.
Код
Heroku Планировщик работы:
rake update_retweet_cache
scheduler.rake (в мое приложение)
task :update_retweet_cache => :environment do
Tweet.delay.cache_retweets_for_all_auths
end
Tweet.rb, update_retweet_cache метод:
def self.cache_retweets_for_all_auths
@authentications = Authentication.find_all_by_provider("twitter")
@authentications.each do |authentication|
authentication.user.twitter.retweeted_to_me(include_entities: true, count: 200).each do |tweet|
# Actually build the cache - this is good - removing to keep this short
end
end
end
User.rb, метод твиттера:
def twitter
authentication = Authentication.find_by_user_id_and_provider(self.id, "twitter")
if authentication
@twitter ||= Twitter::Client.new(:oauth_token => authentication.oauth_token, :oauth_token_secret => authentication.oauth_secret)
end
end
Примечание: Как я отправляю это, я заметил, что я нахожу все «щебет» аутентификации в «cache_retweets_for_all_auths» метод, затем вызывая «User .twitter ", который специально ограничивает аутентификацию" twitter ". Это явно избыточно, и я исправлю это.
Привет - спасибо за отличный ответ! Во-первых, я не уверен, в чём ошибка, о которой я боюсь, потому что прошло некоторое время с тех пор, как я получил ее. Вот почему я думаю: «Ну, почему бы не просто убедиться, что я ЛЮБЛЮ ошибку от Twitter, чтобы она не бомбила вещи?» Как только я начну видеть ошибки, которые были пойманы, я могу получить более подробный/точный. – JoshDoody
Далее я должен сказать, что причина, по которой я использую job/delayed_job, заключается в том, что обновления кеша занимают довольно много времени. Иногда задание выполняется в течение нескольких минут (даже для одного пользователя). Поэтому я периодически создаю кеш (скажем, один раз в час) и удаляя старые записи один раз в день. Таким образом, при загрузке сводной страницы (которая использует данные Twitter) не происходит задержки, и мой кеш не становится огромным. Наконец, ваш «должен быть, а не» блок показывает одно и то же дважды. Но мне очень интересно видеть ваше предложение. Не могли бы вы исправить это? – JoshDoody
жаль, что, должно быть .find_each вместо .each. Будет обновлен ответ за секунду. – rovermicrover