Shoryuken,それと例外検知gemを作った話

みなさんさようなら. Railsの非同期処理って何使ってますか?

Sidekiq?Resque?,え?DelayedJob?

個人的にはSidekiqが結構好きで,よく使っていたのですが,最近Redisのメモリが足らなくなってきて…… たまにエンキューに失敗します.

もちろんインスタンスタイプを上げればいいんですが,それなりの値段するじゃないですか.

Shoryukenを使ってみる

Shoryukenというのがあってですね,だいたいSidekiqと同じ要領で使える非同期処理用のgemなんですが,バックエンドがAWS SQSなんですよ. だから,これRedisの運用とか真面目に考えなくてもいけるんじゃね?とりあえず全部メッセージに突っ込んでも,重くならないし!

そんなこんなでShoryukenを使ってみました. というか,既に運用しているasumibotに入れて,運用してます.

github.com

Shoryukenの細かい動作についてはこのへんにまとめました.

qiita.com

使用感:

  • SQSを使うのでメモリのことを気にしなくても良く,エンキュー数が増えてきても安心
  • 料金的に$0.5/1M という非常に安い価格設定なので,Redisを増設するより安い
  • (そもそもキューってRedisに入れるほどの情報でもないし……
  • マルチスレッドで,だいたいSidekiqと同じ要領で使える
  • ローカルでのSQS再現にはFakeSQSを使えばいいので,開発環境でのAWSSQS課金についての心配は不要
  • 今のところ例外が起こってもどこにも通知されない
  • リトライの機構についてはSQSを頼ることになるので,若干不便
  • 速度的には,SQSのポーリグ間隔(によってSQSの料金が変わる)に依存するので,Sidekiqほど即時に処理してくれるわけではない

例外が通知されないのは困る

上記の中でも特に例外のところが困っていて,RailsのアプリだとExceptionNotification等で例外を検知していると思うのですが,そこで検知してくれない.

Sidekiqなんかだと,ExceptionNotification側に既に用意されていて,割と簡単に用意できたりします.

github.com

これがないのが困っていて,みんなどうしているのかなー?

ExceptionNotification::Shoryuken

と思っていても始まらないので,gemを作りました.

github.com

だいたい,ExceptionNotificationのSidekiqをパクった感じです.

普通にインストールしたら,config/initializers/exception_notification.rb あたりに,

require 'exception_notification/shoryuken'

ExceptionNotification.configure do |config|
  # setup some notification
end

とか書いておけば,勝手に検知して,その他の例外と同じように設定してある通知先(メールとかSlackとか)に通知してくれます.

Shoryukenってまだ直しどころがある

実はShoryuken本体の方にもPullRequestを投げたりしているのですが,Shoryukenってまだ未熟な感じがします. 使ってると足らないところを結構発見するので,直し甲斐があるというか,PullRequestが積まれるというか.

ソース的にはSidekiqを参考にしている色が強く出ていて,PullRequestやIssueの議論でもSidekiqの話がたまに例に出されます.

そういう話をして,Sidekiqのソースを見に行くと「完成度たけーなおい」と思うしかない.

Shoryukenはそれに比べると,機能的にも少ないし,完成度もまだまだな感じがします. それは盛り上がり方とか,作者のやる気にも寄るんでしょうけど…….

使う人が増えてくれれば嬉しいんですが,みんな本当に非同期処理って何使ってるんだろう?

SQSの機能が,Sidekiq+Redisほどブラックボックスとして扱えないので,SQSの知識が必要になってしまうという障壁はあるんですが. それでも,それなりの大きさのRedis運用をまともに考えるよりは,かなり手抜きができて使いやすいと思うんですけどね.