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
510
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 de Wasm
wtnabe
0
4
Cloud Native Buildpacksって結局どうなの?
wtnabe
0
9
Decoupled System with Turbo Frame
wtnabe
1
59
join-kanazawarb-or-7years-passed-since-it-was-borned
wtnabe
0
700
let-me-edit-with-editor
wtnabe
0
260
google-photos-and-storage-and-rclone
wtnabe
0
340
one case of how to begin vuejs
wtnabe
2
390
Kanazawa.rb meetup #56 Coderetreat Intro
wtnabe
0
380
lightweight authenticity of microservices
wtnabe
0
400
Other Decks in Programming
See All in Programming
1人で挑むSwiftコンパイラ 〜型システム入門編〜
s_shimotori
0
310
Playwrightから始めるVisual Regression Testingのススメ by とっと
totto2727
2
1.8k
Swift Concurrencyとレースコンディション
objectiveaudio
1
390
初めてのiOS関連GitHub ActionsをMarketplaceに公開するまでの実録
konifar
3
200
これからの時代の新標準!SwiftTestingへの移行とトラブルシューティング
uetyo
0
460
rails_girls_is_my_gate_to_join_the_ruby_commuinty
maimux2x
0
130
Rechartsで楽にゴリゴリにカスタマイズする!
10tera
1
120
rbs-inlineを導入してYARDからRBSに移行する
euglena1215
1
210
What is Parser
yui_knk
8
2.2k
iOSDC 2024 SMBファイル共有をSwiftで実装する
kishikawakatsumi
1
110
2024 컴포즈 정원사
jisungbin
0
150
What we keep in mind when migrating from Serverless Framework to AWS CDK and AWS SAM
kasacchiful
1
130
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
26
1.9k
YesSQL, Process and Tooling at Scale
rocio
167
14k
Build your cross-platform service in a week with App Engine
jlugia
228
18k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
122
18k
Adopting Sorbet at Scale
ufuk
72
8.9k
Six Lessons from altMBA
skipperchong
26
3.3k
GraphQLの誤解/rethinking-graphql
sonatard
65
9.7k
Fireside Chat
paigeccino
31
2.9k
Embracing the Ebb and Flow
colly
83
4.4k
How GitHub Uses GitHub to Build GitHub
holman
472
290k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
88
16k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
41
6.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 の呼び⽅呼ばれ⽅のコードというよりは 遅延時間やジョブの衝突などの⽅で、こ れは⾮常にテストしにくい
(機会があれば) 頑張ります><