Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rails Async Process with Sidekiq
Search
wtnabe
August 29, 2015
Programming
1
620
Rails Async Process with Sidekiq
『Railsで非同期処理 - Sidekiqを使うための準備と使ってみて気づいたこと』 via Kanazawa.rb meetup #36
wtnabe
August 29, 2015
Tweet
Share
More Decks by wtnabe
See All by wtnabe
Rubyでもモノリポしたい - 調査、おわわり編 -
wtnabe
0
21
Ruby de Railway Oriented Programming
wtnabe
0
51
Bindanのススメ
wtnabe
0
35
そのオブジェクト、何を保証してくれますか? - GuideRailのススメ -
wtnabe
0
47
Effective Jekyll
wtnabe
0
77
5 min Jekyll/Liquid Plugin cooking
wtnabe
0
42
Ruby de Wasm
wtnabe
0
71
Cloud Native Buildpacksって結局どうなの?
wtnabe
0
57
Decoupled System with Turbo Frame
wtnabe
1
140
Other Decks in Programming
See All in Programming
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
7
1.5k
MDN Web Docs に日本語翻訳でコントリビュート
ohmori_yusuke
0
420
20251212 AI 時代的 Legacy Code 營救術 2025 WebConf
mouson
0
240
【卒業研究】会話ログ分析によるユーザーごとの関心に応じた話題提案手法
momok47
0
170
從冷知識到漏洞,你不懂的 Web,駭客懂 - Huli @ WebConf Taiwan 2025
aszx87410
2
3.3k
ZJIT: The Ruby 4 JIT Compiler / Ruby Release 30th Anniversary Party
k0kubun
1
320
ThorVG Viewer In VS Code
nors
0
670
AtCoder Conference 2025「LLM時代のAHC」
imjk
2
650
コマンドとリード間の連携に対する脅威分析フレームワーク
pandayumi
1
210
AI Agent Tool のためのバックエンドアーキテクチャを考える #encraft
izumin5210
6
1.6k
.NET Conf 2025 の興味のあるセッ ションを復習した / dotnet conf 2025 quick recap for backend engineer
tomohisa
0
110
GoLab2025 Recap
kuro_kurorrr
0
3.8k
Featured
See All Featured
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
0
430
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.9k
Making the Leap to Tech Lead
cromwellryan
135
9.7k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
270
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
0
1k
AI: The stuff that nobody shows you
jnunemaker
PRO
2
170
How to train your dragon (web standard)
notwaldorf
97
6.5k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
94
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
120
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
Transcript
Railsで⾮同期処理 Sidekiqを使うための準備と 使ってみて気づいたこと @wtnabe Kanazawa.rb meetup 36 2015-08-29 (Sat) at
IT-Plaza MUSASHI
お品書き ⾮同期処理とは Sidekiq ⾮同期Worker作成時の注意 課題はテスト
⾮同期処理とは
Railsで⾮同期処理とは HTTP requestと同期しないもの ジョブの実⾏指定と実際の実⾏時間が同 期しないもの 伝統的なバッチジョブは違う? クライアントサイドの⾮同期処理とは意味が違う
例えば POST時の処理を後回しに メールの送信 画像のサムネイル⽣成 response time短縮向け ⼤量の作業をスケジュール実⾏
⾮同期⽤のGem Rails 4.2+ ActiveJob ( adaptor ) Rails 4.1- (various
methods) DelayedJob BackgrounDrb Rescue Sidekiq
Sidekiq
Sidekiqの特徴 http://sidekiq.org/ Queue ⽤のストレージは Redis Celluloid を使ったスレッドモデル Sinatra 製の Dashboard
付き Sidekiq Pro アリ
今回選んだ理由 もともとよく名前を⽬にしていた redis 環境の⽤意が楽になっていた Sidekiq Pro があるってことはビジネスを 起こせるレベルのツールと看做せる Dashboard がレポートとしても使えそう
セットアップ bundle install Procfile initializers/sidekiq.rb config/sidekiq.yml config/routes.rb ( if you
wish Dashboard )
Redisのインストールは省略
bundle install in Gemfile gem 'sidekiq'
Foremanの話はこちら 前回 meetup #35 で紹介済み Lightweight PHP development environment with
Foreman and built-in server // Speaker Deck
Procfile Sidekiq⽤に別なRailsを⽴ち上げるイメージ web: bundle exec rails s redis: redis-server worker:
mkdir -p tmp/pids && \ bundle exec sidekiq \ -C config/sidekiq.yml Unicornと同じように全部bundle execで済んじゃう
Herokuでは初期化に注意 RailsのバージョンによってDATABASE接 続の設定反映の挙動が違う Herokuは環境変数設定を推奨している が、特にその辺りが違う see Advanced Options · mperham/sidekiq
Wiki
Concurrencyに注意 RailsのDB connection poolはdefault 5 Sidekiqのconcurrencyはdefault 25 溢れるに決まってる><
sidekiq.ymlの例 :concurrency: 3 :staging: :concurrency: 9 :production: :concurrency: 9 development
は SQLite, production と staging で web と worker 2つの サーバから max 20 conn までの DB サーバに繋ぐ想定
Dashboard in Gemfile gem 'sinatra' in routes.rb require 'sidekiq/web' mount
Sidekiq::Web => '/sidekiq' もちろんアクセス制限は忘れないで><
Sidekiq Dashboard Demo
Workerの作り⽅
in Gemfile gem 'sidekiq'
in application.rb app/workers ディレクトリを 作る autoload 対象に eager_load 対象に eager_load
については ggl `rails thread'
in foo_worker.rb class FooWorker include Sidekiq::Worker def perform(*args) end end
How to use FooWorker.perform_async(arg1, ...) FooWorker.perform_in(time, arg1, ...) etc
worker⽤のRails上で perform()が呼ばれる request を受けた Rails とは別な⼈であることに注意 perform_in() を使うと遅延時間が指定できる
Worker作成時の注意点
基本⽤語 ここでは以下のように⾔葉を⽤いる Worker 実際に⾮同期の動作を担当するclass ジョブ Workerが実⾏する⼀つ⼀つの処理
注意点 perform() にはプリミティブを与える できるだけ細かくジョブを分ける ※ Rubyにはプリミティブなんて存在しないけど
serializeしたオブジェクト じゃダメなの?
オブジェクト渡し 簡単だしDBに負担掛けない Queueの容量膨らむ 安定してdeserializeできるとは限らない 処理の記録の意味が分からない
処理の記録重要 ⾮同期処理はいつ終わるか分からない 「ポチッとやって結果を⽬視」みたいな やり⽅は通⽤しない
Sidekiqの記録 Workerの名前と引数がそのまま残る readableな名前と引数を使う
class BulkThumbnailGeneratorWorker include Sidekiq::Worker def perform(k, id, attr, size) r
= Object.const_get(k).find(id) ... end end 例えば⼀括サムネイル⽣成
こうすると どのModelの どのIDの どのカラムの画像を どのサイズにするのか これらが記録に残る。readableで丸分かり。
しかも ⼩分けにできる
ジョブの⼩分け重要 × 1万回のeachのある1つのジョブ ◦ 1万のジョブ ※ ⼩分けなら記録も明確で途中からretryできる
ジョブの分け⽅ ⼤量の作業が必要な場合 peform の中で each しない each の中で perform_in を呼ぶ
処理に掛かる時間を予測して遅延時間 を指定しておく もちろん必要な遅延時間はあらかじめ予測して検証する
課題はテスト
今のところ⾃動テストなし そんなに変更しない いつも⾛らせる必要はない
⼤きな課題は peform の呼び⽅呼ばれ⽅のコードというよりは 遅延時間やジョブの衝突などの⽅で、こ れは⾮常にテストしにくい
(機会があれば) 頑張ります><