0

私がしていること

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」メソッドを呼び出していることに気付きました。これは明らかに冗長なので、修正します。

4

1 に答える 1