Rails 4 × Heroku × EventMachine(ワーカ)を爆速でスタートする


Herokuのワーカプロセスは、crashした場合に自動的に再起動してくれるそうですので、EventMachineを使ったスクリプトを動かすのには最適です。たとえば、Twitterを監視したり、イベント・ドリブン、定期的に実施したい処理の場合にお勧めです。

また、今回EventMachineのスクリプト単体ではなく、Railsに組み込みました。理由は僕がRailsのフレームワークに慣れきって、RSpecのテスト書いたり、便利なgemを使いやすいからです。多分、生産性の高さと、Railsのオーバーヘッドとの兼ね合いだと思います。


🐰 前置き:プロジェクトを新規作成する場合

Rails4 x heroku用のApplication Templateを作ってみた!』のコマンドでプロジェクトを作成するとEventMachineを使うかの質問が出るので、yesと打っていただければ、自動的に次のコードが入ります。

今回はEventMachineの利用で一番多そうな、『Twitter Stream API』を例にしたソースコードの導入です。実際の利用では適宜変更してみてください!

🗽 Gemの導入・設定

Gemfileに以下を追加して、bundle installを実行。

# EventMachine/Twitter Stream API
gem 'eventmachine'
gem 'tweetstream'

🐡 EventMachineのコード

メインのEventMachineのソースコードは、lib/EventMachine/twitter_stream.rbに置くことにします。

ちなみに1つのEventMachine内では、id基準でチェックするか、keyword基準でチェックするかのどちらか一方しかできないっぽいです。

require_relative '../../config/environment'
# Twitter username => id変換: http://tweeterid.com/
@follower_id_list = ['xxxx']
@track_words = ['xxxx']
TweetStream.configure do |config|
config.consumer_key = ENV['TWITTER_CONSUMER_KEY']
config.consumer_secret = ENV['TWITTER_CONSUMER_SECRET']
config.oauth_token = ENV['TWITTER_OAUTH_TOKEN']
config.oauth_token_secret = ENV['TWITTER_OAUTH_TOKEN_SECRET']
config.auth_method = :oauth
end
EM.run do
def write_to_mongodb(status)
EM.defer do
$stdout.print "status: #{status}\n"
$stdout.flush
# statusの処理
## ゴニョゴニョ
end
end
# Twitterのuser idをStream APIで常時チェック
TweetStream::Client.new.on_error do |message|
$stdout.print "message: #{message}\n"
$stdout.flush
Airbrake.notify(e, parameters: {message: message})
end.follow(@follower_id_list) do |status|
write_to_mongodb(status)
end
# Twitterでkeywordが出るのをStream APIで常時チェック
TweetStream::Client.new.on_error do |message|
$stdout.print "message: #{message}\n"
$stdout.flush
Airbrake.notify(e, parameters: {message: message})
end.track(@track_words) do |status|
write_to_mongodb(status)
end
end

🐠 Procfileの設定

Procfileの設定はこちら。

worker: bundle exec ruby lib/eventmachine/twitter_stream.rb

🎃 Twitterのキー情報の取得と環境変数への登録

まずは次のサイトでTwitterアプリケーションを登録してください。

(Sign in => アプリケーションの登録)

Twitter Developers

登録したら環境変数にTwitterキーを登録します。まずはローカルへのキー情報の登録です。

Gem「Figaro」を使っている場合は、config/application.ymlに次のコードを入力。

TWITTER_CONSUMER_KEY: xxxx
TWITTER_CONSUMER_SECRET: xxxx
TWITTER_OAUTH_TOKEN: xxxx
TWITTER_OAUTH_TOKEN_SECRET: xxxx

🐞 Herokuへのデプロイ

では、Herokuにソースコードをデプロイ。

(このまえにソースはローカルでGitにコミットしておいてください)

heroku create test-app --stack cedar
git push heroku master

FigaroでTwitterのキー情報をHerokuの環境変数に登録。

rake figaro:heroku['test-app']

ワーカプロセスを起動!

heroku scale web=0
heroku scale worker=1

ちなみにプロセスはWeb orワーカが1つなら無料ですが、2つ以上のプロセスが起動していると有料になるので注意して使ってください。

📚 おすすめの書籍

🖥 サーバについて

このブログでは「Cloud Garage」さんのDev Assist Program(開発者向けインスタンス無償提供制度)でお借りしたサーバで技術検証しています。 Dev Assist Programは、開発者や開発コミュニティ、スタートアップ企業の方が1GBメモリのインスタンス3台を1年間無料で借りれる心強い制度です!(有償でも1,480円/月と格安)