我在做什么
我在我的应用程序中使用了twitter gem(Twitter API 的 Ruby 包装器),该应用程序在Heroku上运行。我使用Heroku 的调度程序定期运行缓存任务,这些任务使用 twitter gem 来更新特定用户的转发列表。我也在使用delayed_job,所以调度程序调用了一个rake任务,它调用了一个“延迟”的方法(参见下面的scheduler.rake)。该方法循环通过“身份验证”(对于通过我的应用程序对 twitter 进行身份验证的用户)来更新每个授权用户在应用程序中的转发缓存。
我的问题
我在做什么错?例如,由于我使用的是 Heroku 的调度程序,delayed_job 是多余的吗?此外,您可以看到我没有发现(拯救)任何错误。因此,如果 Twitter 无法访问,或者用户的身份验证令牌已过期,那么一切都会阻塞。这显然是愚蠢和可怕的,因为如果出现错误,整个事情就会窒息并最终创建一个失败的延迟作业,这会给我的应用程序带来连锁反应。我可以看到这很糟糕,但我不确定最好的解决方案是什么。我应该如何/在哪里发现错误?
我将把我的所有代码(从调度程序到被调用的方法)放在我的一个缓存方法中。我真的只是希望有一个项目符号列表(可能还有一些代码或伪代码)来谴责我糟糕的编码实践并告诉我在哪里可以改进。
我已经看到了这个 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”方法中找到了所有“twitter”身份验证,然后调用“User.twitter”方法,该方法专门限制为“twitter”身份验证。这显然是多余的,我会修复它。