2
0

rails非同期処理 gem比較

Posted at

実務で扱っているアプリケーション(Rails)に非同期処理を導入することになり、代表的なgemの特徴・メリット・デメリットを調査しました。せっかくなので簡単にまとめておきます。

調査対象のgem

  • Sidekiq
  • Shoryuken
  • Rescue
  • Delayed_job

比較表

GitHubスター数は2023年9月頃のものです。また「〇、△、✕」は条件次第で変わってくるものもあると思います、参考程度の認識でお願いします。

Sidekiq Shoryuken Rescue Delayed_job
GitHubスター数 12.7k 2k 9.3k 4.8k
キューイング Redis AmazonSQS Redis RDB
処理方式 マルチスレッド マルチスレッド シングルスレッド シングルスレッド
パフォーマンス
耐障害性
コスト
リトライ処理
メリット ・高性能
・導入事例が多い
・耐障害性高(キューのロストリスク無し)
・高性能
・低コスト
・比較的高性能
・メモリリーク/肥大化のリスクなし(jobごとに子プロセス起動)
・導入しやすい(Redis不要)
・低コスト
デメリット ・スレッドセーフな実装が求められる ・個人が開発したGem
・導入事例が少ない
・スレッドセーフな実装が必要
・ローカルでの検証が若干手間
・job大量実行時はフォークのオーバーヘッドでパフォーマンス低下
・自動リトライ無し
・RDBゆえにパフォーマンス低
・大規模アプリケーションには不向き

補足

  • パフォーマンス
    マルチスレッドのSidekiq, Shoryukenが優勢、キューイングがRDBであるがゆえにDelayed_jobは劣勢。

  • 耐障害性
    盤石なAmazonSQSを扱うShoryukenが優勢。その他も構成次第では耐障害性を高めることは可能な認識。

  • コスト
    低コストなSQSを扱うShoryuken、RDBを流用できるDelayed_jobが優勢。

  • リトライ処理
    唯一Rescueがjobエラー時の自動リトライ処理がない。(ジョブ毎に個別に実装が必要)

結論

私のチームではSidekiqを扱うことで決まりました。理由としては、チーム内にSidekiqの経験豊富な方がいたという点が大きいです。またShoryukenは個人が開発したgemであったり、Rescueはリトライ処理がなかったり、Delayed_jobは小規模アプリケーション向きだったり決め手に欠きました。

スレッドセーフについて

「スレッドセーフとは何か」は別記事でまとめたいと思います。ちなみにチームメンバーのベテランエンジニアの方はこれまで何度もSidekiqを扱ってきたが、あまりスレッドセーフを意識することはなかったとのこと。

Sidekiq扱っている皆さん、ジョブの実装時にスレッドセーフはどこまで意識していますか?よかったら教えてください!

2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0