酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

Rails4 × Heroku × Eventmachine(worker)を爆速でスタートする

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

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


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

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

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

Gemの導入・設定

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

1
2
3
# EventMachine/Twitter Stream API
gem 'eventmachine'
gem 'tweetstream'

eventmachineのコード

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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の設定はこちら。

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

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

まずは以下のサイトでTwitterアプリを登録してください。
(Sign in => アプリの登録)

Twitter Developers

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

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

1
2
3
4
TWITTER_CONSUMER_KEY: xxxx
TWITTER_CONSUMER_SECRET: xxxx
TWITTER_OAUTH_TOKEN: xxxx
TWITTER_OAUTH_TOKEN_SECRET: xxxx

Herokuへのデプロイ

では、Herokuにソースコードをデプロイ。
(このまえにソースはローカルでgitにコミットしておいてください)

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

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

1
rake figaro:heroku['test-app']

workerプロセスを起動!

1
2
heroku scale web=0
heroku scale worker=1

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

おすすめの書籍