Sinatraアプリを定期的に実行するために泥臭く行ってみた
Sinatra版のフィードアグリゲータをゴリゴリ
kaakaa/INFOMATOR · GitHub
今までは以下の流れで処理をしていた。
トップページにアクセスがある
→登録されてるサイトのフィードを取りに行く
→パースする
→表示する
これだとF5アタックされた時に簡単に落ちてしまうことがわかった。
当たり前だろ。
なので、もう少し処理を簡単にするために、ユーザーからのアクセスとは関係なく、
Cron的に定期的にフィードを処理してDBに保存するようにしてみた。
やったことは
## reload API
post '/reload' do Site.all.each do |site| site.reload() end end
これはPOSTで良いのかな…。
## Cron的な
これはforemanが複数プロセスを同時に立ち上げられるので、それを利用してみた。
cron.ru
require File.join(File.dirname(__FILE__), 'cron.rb') run Cron.new
cron.rb
# coding: utf-8 require 'net/http' class Cron def call(env) case env['REQUEST_METHOD'] when 'GET' return [ '200', {'Content-Type' => 'text/html'}, ['<html><head></head><body>Cron</body></html>'] ] end end def initialize while true sleep 10 http = Net::HTTP.new('localhost', 5000) req = Net::HTTP::Post.new('/reload') http.request(req) end end end
CronクラスはRackインタフェース実装してるけど、それはforemanで動かすためだけ。
initializeの中で定期的に/reloadへアクセスしている。
う〜んこのやっつけ感…。
でも、これならLinuxでもWindowsでも動きそうだし良いかな…。
良い方法見つかったら書き直します。