読者です 読者をやめる 読者になる 読者になる

kaakaa Blog

この世は極楽 空にはとんぼ

Sinatraアプリを定期的に実行するために泥臭く行ってみた

Sinatra

Sinatra版のフィードアグリゲータをゴリゴリ
kaakaa/INFOMATOR · GitHub

今までは以下の流れで処理をしていた。

トップページにアクセスがある
→登録されてるサイトのフィードを取りに行く
→パースする
→表示する

これだとF5アタックされた時に簡単に落ちてしまうことがわかった。
当たり前だろ。

なので、もう少し処理を簡単にするために、ユーザーからのアクセスとは関係なく、
Cron的に定期的にフィードを処理してDBに保存するようにしてみた。

やったことは

  • reloadのAPI作る
  • reload API叩くCron的なプロセス作る。

## 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でも動きそうだし良いかな…。

良い方法見つかったら書き直します。