Чем я занимаюсь
Я использую twitter gem (оболочку Ruby для API Twitter) в своем приложении, которое запустить на Heroku. Я использую планировщик Heroku для периодического выполнения задач кеширования, которые используют гем twitter для, например, обновления список ретвитов для конкретного пользователя. Я также использую delayed_job, поэтому планировщик вызывает задачу rake, которая вызывает "отложенный" метод. (см. scheduler.rake ниже). Метод проходит через «аутентификации» (для пользователей, которые прошли аутентификацию в Twitter через мое приложение) для обновления кеша ретвитов каждого авторизованного пользователя в приложении.
Мой вопрос
Что я делаю не так? Например, поскольку я использую планировщик Heroku, является ли delayed_job избыточным? Кроме того, вы можете видеть, что я не улавливаю (спасаю) никаких ошибок. Итак, если Twitter недоступен или если срок действия токена авторизации пользователя истек, все задыхается. Это, очевидно, глупо и ужасно, потому что, если есть ошибка, все это задыхается и в конечном итоге создает неудавшуюся задачу delayed_job, которая вызывает волновые эффекты для моего приложения. Я вижу, что это плохо, но я не уверен, какое решение лучше. Как / где я должен отлавливать ошибки?
Я поместил весь свой код (от планировщика до вызываемого метода) для одного из моих методов кеширования. Я просто надеюсь на маркированный список (и, возможно, какой-то код или псевдокод), отчитывающий меня за плохую практику программирования и сообщающий, где я могу что-то улучшить.
Я видел этот вопрос SO, который мне немного помогает с блоком begin / rescue, но Я мог бы воспользоваться дополнительными инструкциями по обнаружению ошибок, и одним из них более высокого уровня "это хороший способ сделать это?" самолет.
Код
Работа планировщика 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, метод twitter:
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
Примечание. Когда я публиковал это, я заметил, что нахожу все аутентификации "twitter" в методе "cache_retweets_for_all_auths", а затем вызываю метод "User.twitter", который конкретно ограничивает "twitter "аутентификации. Это явно избыточно, и я это исправлю.