rails + serverengineでお手軽daemon

Post on 16-Apr-2017

1.103 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

rails + serverengineで

お手軽daemon

Akira Miki Repro Inc.

shinjuku.rb #29@metaps Sep 30, 2015

Akira Miki Repro

@treetreeslight

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

About job

Reproで使っているjob群

serverengine sidekiq AWS lambda

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

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

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

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

serverengine sidekiq AWS lambda

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

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

•Push送る etc…

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

serverengine sidekiq AWS lambda

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

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

•Push送る etc…

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

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

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

cron

Rake script

SQSSDK

1分単位だよぉ

あれ?メモリ溢れてね?

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

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

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

cron

SQSSDK Server

隠しURL

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

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

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

ちゃんとする期

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

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

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

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

serverengine

serverengine 使いやす!!!

SQSSDK serverengine

long poling

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

気をつけたこと

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しながら止まらず前進

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

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

serverengine

serverengine.pid

Kill

Kill

1回目

2回目

start

start

polling中

serverengine.pid

Override

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

worker

worker

serversupervisor

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

でした

serverengine sidekiq AWS lambda

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

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

•Push送る etc…

まとめ

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

top related