New-Village

月間ブログ。だいたい1カ月に1回は更新しているようです。

heroku schedulerを使う

ようやくRSSリーダーが完成しました

https://xapp8.herokuapp.com/

セキュリティとかまったく考えていないので、アカウントを作成される際は注意してください。また、同サービスは予告無しに終了しますので、登録したデータは保証されませんのでご注意ください。本気で使い始める人は居ないと思いますが一応。

f:id:New-Village:20140831194123p:plain

さて、RSS作成の最後はフィードの自動更新機能の実装です。

 

■ briefing

今回は、sitesテーブルに登録されているrss_urlからフィードを取得して、feedsテーブルとmainsテーブルに登録します。

なお、フィードの取得はheroku schedulerを使って lib/tasks のrakeファイルを実行させる形とします。今回は計算の結果、1時間間隔で自動収集とします(参考資料参照)。

 

 

■ ブランチの作成

今回は記事収集機能を実装するので、"feedRake"というブランチを作成します。

~/workspace/xapp8(master)$ git checkout -b "feedRake"
~/workspace/xapp8(feedRake)$

 

■ 今回の実装方針

以下の流れの機能を実装して行きます。

① heroku schedulerから"rake db:getfeed"を実行する

② sitesのrss_urlを一件づつ読み込んでフィードを取得する

③ 取得したフィードをfeedsテーブルに登録する

④ Sbscsテーブルを参照して、mainsテーブルを作成する。

 

■ 登録サイトからフィードを取得(②-④)

登録サイト数が増えれば増えるほどパフォーマンスが低下するのでロジックは再考の余地が大いにあるのですが、動かすことを優先したので以下のような無いようになっています。

lib/tasks/getfeed.rake

 

namespace :db do
  desc "登録されているSitesのフィードを取得してfeedsに格納します"
  task getfeed: :environment do

  Site.find_each do |site|
    @fjr = Feedjira::Feed.fetch_and_parse site.rss_url
    for num in 0..9 do
      @feed = @fjr.entries[num.to_i]
      unless @feed.nil? then
        @regFed = Feed.new
        @regFed.title = @feed.title
        @regFed.url = @feed.url
        @regFed.publish_at = @feed.published
        @regFed.site_id = site.id
        unless @feed.summary.nil? then
          @regFed.summary = @feed.summary
        end
        @regFed.save

      end # unless @feed.nil? end
    end # for end

    Sbsc.where(:site_id => site.id).find_each do |sbsc|
      Feed.where(:site_id => site.id).find_each do |feed|
        Main.create(user_id: sbsc.user_id,
          feed_id: feed.id,
          read_flg: "f"
        )
      end
    end
  end # site.each end


  end
end

 

■ heroku schedulerへの登録(①)

heroku schedulerを使うにはクレジットカードの登録が必要になります。まずは、https://dashboard.heroku.com/account#billing でクレジットカード情報を登録します。

次に add-onの画面からheroku schedulerを選択して、自分のアプリケーションを選択してから"Add Standard for Free"を選択します。

スケジューラーを登録したらschedulerのダッシュボード画面を開いて、タスクを登録します。

実行するコマンドは以下の通りです。

rake db:getfeed

 

■ 参考資料

heroku scheduler の起動間隔は、1日毎、1時間毎、10分毎から選択できますが、無料枠で済ませる場合には、各タスクの実行時間は以下の範囲内に納める必要があります。

起動間隔

min

sec

なし

360

21,600

1日毎

11

696

1時間毎

0.45

29

10分毎

-

4.8