26
rails + serverengineお手軽daemon Akira Miki Repro Inc. shinjuku.rb #29@metaps Sep 30, 2015

rails + serverengineでお手軽daemon

Embed Size (px)

Citation preview

Page 1: rails + serverengineでお手軽daemon

rails + serverengineで

お手軽daemon

Akira Miki Repro Inc.

shinjuku.rb #29@metaps Sep 30, 2015

Page 2: rails + serverengineでお手軽daemon

Akira Miki Repro

@treetreeslight

Page 3: rails + serverengineでお手軽daemon
Page 4: rails + serverengineでお手軽daemon

解析から解決までサクッと

Page 5: rails + serverengineでお手軽daemon

About job

Page 6: rails + serverengineでお手軽daemon

Reproで使っているjob群

serverengine sidekiq AWS lambda

監視して発火制御したい 並列数を制限したい

並列数を制限しない ガンガン処理したい

S3などのAWSツール群とシームレスな連携してガシガシ処理したい

Page 7: rails + serverengineでお手軽daemon

どんなことに使ってるの?

serverengine sidekiq AWS lambda

•動画の変換 •解析データキャッシュ •定期決済 •push予約の監視 • InApp対象者の更新 etc…

•メールを送る •解析データを送る •配信データの作成 etc…

•Push送る etc…

Page 8: rails + serverengineでお手軽daemon

どんなことに使ってるの?

serverengine sidekiq AWS lambda

•動画の変換 •解析データキャッシュ •定期決済 •push予約の監視 • InApp対象者の更新 etc…

•メールを送る •解析データを送る •配信データの作成 etc…

•Push送る etc…

Page 9: rails + serverengineでお手軽daemon

選定経緯をプロトタイプ時代の

「恥ずかし~~~い」失敗談も踏まえて

Page 10: rails + serverengineでお手軽daemon

プロトタイプだしとりあえず

cron

Rake script

SQSSDK

1分単位だよぉ

Page 11: rails + serverengineでお手軽daemon

あれ?メモリ溢れてね?

Page 12: rails + serverengineでお手軽daemon

そりゃrails分requireしてrake叩と メモリめっちゃ食うよね!!

プロトタイプとはいえ雑すぎた!!!

Page 13: rails + serverengineでお手軽daemon

プロトタイプとはいえちょっとは気を使っておくか

cron

SQSSDK Server

隠しURL

Page 14: rails + serverengineでお手軽daemon

CPUやるきだしてる・・・?

Page 15: rails + serverengineでお手軽daemon

ffmpegって限界までCPU使うからね!

プロトタイプとはいえ雑すぎた!!!

Page 16: rails + serverengineでお手軽daemon

ちゃんとする期

• railsのmodel資産を使いまわし

• ffmpegがCPUを食い尽くすので並列数は制限しつつ

• Rails requireのメモリのオーバーヘッドは最小限に

• 自前でdaemonラッパー書いても良いけど、シグナル制御系とか書くのめんどい <- 一番コレ

Page 17: rails + serverengineでお手軽daemon

serverengine

Page 18: rails + serverengineでお手軽daemon

serverengine 使いやす!!!

SQSSDK serverengine

long poling

•やることに合わせてworker数調整しつつ •superviser -> 親 -> 子という素敵構成 •ログまわりやシグナルによるプロセス制御までバッチリ

Page 19: rails + serverengineでお手軽daemon

気をつけたこと

Page 20: rails + serverengineでお手軽daemon

Exception

def cycle invoke end def invoke( *arguments ) execute( *arguments ) rescue => error report_exception(error) end

def execute( *arguments ) raise NotImplementedError end

def report_exception(error) # logging, rollbar, newrelic ... end

• handleしながら止まらず前進

Page 21: rails + serverengineでお手軽daemon

Avoid memory leak• (rubyの設定で解決できると思うけど)fragmentationが溜まるので定期的に強制GC

class worker … def run begin GC.stop cycle ensure GC.start end rescue Exception => error report_exception error end … end

Page 22: rails + serverengineでお手軽daemon

Zombi process• long poling中にdeployを連続すると、zombiができる

serverengine

serverengine.pid

Kill

Kill

1回目

2回目

start

start

polling中

serverengine.pid

Override

Page 23: rails + serverengineでお手軽daemon

Memory Usage• serverengineはprocess modelなので、rails全部乗っけてるとプロセス分メモリをいっぱい食べる。

worker

worker

serversupervisor

Page 24: rails + serverengineでお手軽daemon

これ監視系じゃないし sidekiqでもよかったんじゃ?

Page 25: rails + serverengineでお手軽daemon

でした

serverengine sidekiq AWS lambda

•動画の変換 •解析データキャッシュ •定期決済 •push予約の監視 • InAppのターゲット更新

•動画の変換 •メールを送る •解析データを送る •配信データの作成 etc…

•Push送る etc…

Page 26: rails + serverengineでお手軽daemon

まとめ

• serverengine使うとdaemonがサクッとできる