Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話

2,103 views

Published on

ActiveJob
プロセス管理ツール
ServerEngine
のはなし

Published in: Internet
  • Be the first to comment

Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話

  1. 1. Shinjuku.rb #29 LT? タケユー・ウェブ 竹内雄一
  2. 2. Shinjuku.rb #29 LT? • 竹内 雄一@大宮 • フリーランス WEBエンジニア (受託メイン 設計~運用) • Ruby on Rails 1.1ぐらいから • そのほかCMS AWS 鯖管 など • むかしつくったもの • rack-ketai … jpmobileがrack対応してなかった時のやつ • KetaiPost … Movable Typeでメール投稿するやつ お世話になった本たち@takeyuweb
  3. 3. 使ったことがある gemの話をします
  4. 4. 使ったことがあるDaemon関係gem • activejob • actioncable • aws-flow • serverengine • god • backgroundrb • sidekiq • resque • delayed_job • sucker_punch いろいろありました。
  5. 5. ActiveJob • 「Active Jobは、ジョブを宣言し、それによってバックエンドでさまざま な方法によるキュー操作を実行するためのフレームワークです。」
  6. 6. 使ったことある人挙手 みんなあるよね?あったらこの話いみないね
  7. 7. What’s ActiveJob ? • Rails標準のキューイング仕様(4.2~) • 時間のかかる処理を裏でやるやつ • これまでいろんなgemがありそれぞれのやり方を覚える必要があった • BackgrounDRb / Resque / Delayed Job / Sidekiq / Sucker Punch etc… • 標準があることで書き方を統一できて嬉しい
  8. 8. ActiveJobはアダプタ • ActiveJob自体にジョブを記憶したり処理する機能はない • 他のキューイングシステムとRailsをつなぐ • キューイングシステムがなんであっても同じように書ける # ジョブの作成 class MailMagazineDeliveryJob < ActiveJob::Base queue_as :default def perform(post) # 後で実行したい処理をここに書く end end # ジョブを登録したいとき MailMagazineDeliveryJob.perform_later(post)
  9. 9. ActiveJobのバックエンドシステム • 実際のジョブキューへの出し入れは他のを使う • ジョブキューのデータストアもそれぞれなので、用途や目的に応じて使う • (インラインライナー) • バックエンドを指定しないとき。その場ですぐ実行しちゃう。見せかけだけ。 • Sidekiq • データストアとしてRedisが必要 • Sucker Punch • データストア不要 • その他ResqueやDelayedJobなど昔からあるキューイングシステムをバック エンドとして利用できる!
  10. 10. ActiveJobのバックエンドプロセス • 一部の例外を除き、バックグラウンド処理用のdaemonプロセス必要 • 例外 • インラインライナー • 見せかけだけなので。 • Sucker Punch • 他のデータストアやバックグラウンドプロセスなしに、アプリケーションのプロセスだけで、非 同期処理ができちゃうのがウリ。 • バックグラウンドとしてSidekiqを選択したなら • sedis-server • sidekiq -C config/sidekiq.yml
  11. 11. こないだの案件の場合 • AWS • Redisの管理をしたくない • ワーカーを動かすインスタンスのスケールアウトを可能に • Amazon Simple Queue Service (SQS) • ジョブキューの出し入れ、排他制御 • 追記 ジョブ完了後メッセージを削除しないと、 可視性タイムアウト終了後再度落ちてくる • ジョブキュー専用に設計されてて使いやすく堅牢 • Amazon Lambdaなどとの連携も • フルマネージド • スケールアウトが容易
  12. 12. ActiveJobとAmazon SQSをつなぐ
  13. 13. ActiveJobとAmazon SQSをつなぐ • aws sdkを使ってアダプタを自作した • Active Job meets Amazon SQS http://takeyuweb.hatenablog.com/entry/2014/12/11/043515 • ジョブをSQSから取り出してActiveJobのジョブを実行するスクリプトを 書く • job_data = JSON.parse(message[:body]) ActiveJob::Base.execute(job_data) • ただのスクリプトなので、このままでは落ちたら終わり • 永続(サービス)化が必要 ※今ならshoryukenというSQSを利用したgemがあるのでそれを使えば多分楽(永続化もある)
  14. 14. スクリプトのサービス化 • プロセス管理ツール • while(true)な感じのスクリプトをサービス化するためのツール(ざっくり • ロギング、死活監視(落ちてたら起動し直すとか) • 設定ファイルに起動したいスクリプトや環境変数などを設定して、管理ツールのプロセスを起動すると 後は勝手にやってくれる • daemontools • 古典 • Supervisord • 設定ファイルが割と簡単、yumとかでも入る • God • 設定ファイルがruby • プロセスのメモリ使用量が一定以上になったら再起動とか、プログラマブルで高度な機能あり • ググラビリティ低い • Foreman • Herokuで使うやつ
  15. 15. 永続化させたいスクリプトについて • フォアグラウンドで動くもの(をGodの裏で動かすことになる) • while(true)なやつ • 色々自前でやる • Signal.trap(:TERM)とか • プロセスの実行ログの書き出しやログローテーションとか • ServerEngine • 「Unicornのような強固なマルチプロセスサーバーを実装するためのフレーム ワーク」 • ロギング、プロセス管理、ワーカープロセスの並列化 … • うちは複数のスクリプトをそれぞれ永続化したかったので • フォアグラウンドで動くただのスクリプトにし、別のでプロセス管理 • シグナルの処理やロギングだけ使いたい
  16. 16. ServerEngineでGodで管理するスクリプトを • プロセス管理はGod(またはSupervisorなど)でやるので要らない • マルチプロセスは今のところ使ってない(必要になれば考える • フォアグラウンドで動かしたい • ロギングはしたい se = ServerEngine.create( nil, ActivejobWorker, # SQSからデータを取り出してActiveJobジョブを実行するやつ { daemonize: false, # フォアグラウンドで動かす(trueだとバックグラウンドに) supervisor: false, # プロセス管理機能はなし log: Rails.root.join(‘log/activejob_worker_server.log’), # 実行ログの書き出し先 log_rotate_age: 5, # 5世代分保持 log_rotate_size: 1*1024*1024 # 1MBごとにローテート }) se.run
  17. 17. Godの設定 # config/god.rb ROOT_DIR = ENV['RAILS_ROOT'] || File.expand_path(File.join(File.dirname(__FILE__), '..')) God.pid_file_directory = File.expand_path(File.join(ROOT_DIR, 'tmp/pids')) + '/' God.watch do |w| w.name = 'activejob_worker_server' w.dir = ROOT_DIR w.uid = 'deploy' w.env = ENV.to_h # 実行するServerEngineなスクリプト w.start = "bundle exec ruby bin/activejob_worker_server“ # STOPコマンド後待機する秒数 これを超えたら強制終了 w.stop_timeout = 60.seconds # その他メモリ管理とかいろいろ end
  18. 18. デプロイ • AWS OpsWorks • カスタムCookbookを書く • LayerをみてWorker用のやつなら以下 • godなどインストール • デプロイ後の god terminate & god -c ..
  19. 19. まとめ • ActiveJob使った • バックエンドにAmazon SQSを使った • ジョブ実行スクリプトにはServerEngine(の一部機能)を使った • プロセス管理にはGodを使った
  20. 20. おまけ • Rails5に搭載される?されない? ActionCableでも通常のRailsアプリとは別にWebSocket用のプロセス を起動する必要がありました。 • Qiitaに記事書いた Action Cable + Flux + React でリアルタイムチャットデモを作ってみた http://qiita.com/takeyuweb/items/0c421534e5ad1d2657f7

×