Skip to content

Instantly share code, notes, and snippets.

@hoco
Last active August 29, 2015 13:57
Show Gist options
  • Save hoco/9764412 to your computer and use it in GitHub Desktop.
Save hoco/9764412 to your computer and use it in GitHub Desktop.

rubyで非同期処理

はじめに

ここに全部書いてます

ジョブキュー処理のResqueとDelayed Jobの使い分けの方針などはありますか?

非同期処理について

  • ある処理の途中でその処理は中断せずに別の処理を行うこと
  • 時間がかかる処理は後回しにして早く応答だけしたい(特にWebアプリ)

Rubyで使えるのgem

  • DelayedJob
  • Resque
  • Sidekiq

DelayedJob

  • ActiveRecordの使用が前提(もしくはmongoDB)
  • ジョブ用の専用テーブルを作成してそこにキューイングしていく
  • ジョブを処理するためのWorkerプロセスを予め起動しておき、それらがジョブを消化していく
  • デモ

長所

  • ジョブ用のデータストアを別に持つ必要がなくてお手軽

短所

  • 他の永続化データと同居することになるのでDBに負荷がかかる(ジョブの登録/ロック/削除)
  • 同じプロセスが残り続けるのでメモリリーク/フラグメンテーションの考慮が必要

Resque

  • データストアにはRedisを使用
  • Redis? -> インメモリKVS(データ構造色々/非同期永続化/マスタースレーブ構成)
  • Workerプロセスはジョブ実行時に毎回forkしてそのプロセスで処理が行われる
  • デモ

長所

  • 毎回forkするのでメモリリーク/フラグメンテーションが起こる処理なども平気
  • Webの管理画面がある
  • プラグイン豊富

短所

  • 毎回forkするのでオーバーヘッドがあり短時間のジョブに向かない
  • 突然の死(ログ無し)
  • 開発が滞っている?(PR貯まっている)

Sidekiq

  • データストアにはRedisを使用
  • プロセスが複数のスレッドを生成し、各スレッドがジョブを処理する
  • デモ

長所

  • 同時に動くプロセスが少なくなるのでメモリを節約できる
  • プロセスのforkよりもスレッドの切り替えの方が早いのでIO待ちの多いジョブや短時間のジョブに向いている
  • Webのリッチな管理画面
  • ロゴがキモい

短所

  • プロセスはひとつなのでメモリリーク/フラグメンテーションの問題

性能

  • 0.1secかかるメール送信処理を10000ユーザに対して行う
  • 色々かなりいい加減なんで参考程度に

1プロセス/スレッドの場合

DelayedJob Resque Sidekiq
1080 sec 1158 sec 1028 sec

3プロセス/スレッドの場合

DelayedJob Resque Sidekiq
365 sec 389 sec 345 sec

まとめ

  • お手軽にやりたい場合はDelayedJob
  • Redis立てられる & 一つのジョブが重い場合にはResque
  • Redis立てられる & 一つのジョブが軽い場合にはSidekiq

資料

デモ用Railsプロジェクト hoco/compare_bg_job

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment