私がしていること
Herokuで実行されるアプリでtwitter gem (Twitter API の Ruby ラッパー) を使用しています。Heroku のスケジューラを使用して、Twitter gem を使用するキャッシュ タスクを定期的に実行し、たとえば、特定のユーザーのリツイートのリストを更新します。また、 delayed_jobを使用しているため、スケジューラは「遅延」されたメソッドを呼び出す rake タスクを呼び出します (以下の scheduler.rake を参照)。このメソッドは、「認証」(私のアプリで Twitter を認証したユーザーの場合) をループして、アプリ内の承認された各ユーザーのリツイート キャッシュを更新します。
私の質問
私は何を間違っていますか?例えば、Heroku の Scheduler を使っているので、delayed_job は冗長ですか? また、エラーをキャッチ (レスキュー) していないこともわかります。そのため、Twitter に到達できない場合、またはユーザーの認証トークンの有効期限が切れている場合、すべてが停止します。エラーが発生すると、全体が停止し、失敗したdelayed_jobが作成され、アプリに波及効果が発生するため、これは明らかにばかげてひどいものです。これが悪いことはわかりますが、最善の解決策が何であるかはわかりません。どのように/どこでエラーをキャッチする必要がありますか?
キャッシュ メソッドの 1 つにすべてのコード (スケジューラから呼び出されるメソッドまで) を配置します。私は本当に、箇条書きリスト (およびおそらくいくつかのコードまたは疑似コード) がコーディングの練習不足を非難し、どこを改善できるかを教えてくれることを望んでいます.
この SO questionを見たことがありますが、これは 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
注:これを投稿しているときに、「cache_retweets_for_all_auths」メソッドですべての「twitter」認証を見つけてから、特に「twitter」認証に制限する「User.twitter」メソッドを呼び出していることに気付きました。これは明らかに冗長なので、修正します。