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
570
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
Effective Jekyll
wtnabe
0
58
5 min Jekyll/Liquid Plugin cooking
wtnabe
0
25
Ruby de Wasm
wtnabe
0
52
Cloud Native Buildpacksって結局どうなの?
wtnabe
0
44
Decoupled System with Turbo Frame
wtnabe
1
120
join-kanazawarb-or-7years-passed-since-it-was-borned
wtnabe
0
790
let-me-edit-with-editor
wtnabe
0
340
google-photos-and-storage-and-rclone
wtnabe
0
460
one case of how to begin vuejs
wtnabe
2
470
Other Decks in Programming
See All in Programming
Dart 参戦!!静的型付き言語界の隠れた実力者
kno3a87
0
180
可変性を制する設計: 構造と振る舞いから考える概念モデリングとその実装
a_suenami
10
1.7k
GitHub Copilotの全体像と活用のヒント AI駆動開発の最初の一歩
74th
7
2.2k
MySQL9でベクトルカラム登場!PHP×AWSでのAI/類似検索はこう変わる
suguruooki
1
290
Amazon Q CLI開発で学んだAIコーディングツールの使い方
licux
3
180
PHPUnitの限界をPlaywrightで補完するテストアプローチ
yuzneri
0
390
Constant integer division faster than compiler-generated code
herumi
2
510
CLI ツールを Go ライブラリ として再実装する理由 / Why reimplement a CLI tool as a Go library
ktr_0731
3
1k
SQLアンチパターン第2版 データベースプログラミングで陥りがちな失敗とその対策 / Intro to SQL Antipatterns 2nd
twada
PRO
38
11k
マイコンでもRustのtestがしたい その2/KernelVM Tokyo 18
tnishinaga
2
1.6k
CEDEC2025 長期運営ゲームをあと10年続けるための0から始める自動テスト ~4000項目を50%自動化し、月1→毎日実行にした3年間~
akatsukigames_tech
0
110
JetBrainsのAI機能の紹介 #jjug
yusuke
0
190
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
Docker and Python
trallard
45
3.5k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
283
13k
A Tale of Four Properties
chriscoyier
160
23k
The Language of Interfaces
destraynor
158
25k
How STYLIGHT went responsive
nonsquared
100
5.7k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.4k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
The World Runs on Bad Software
bkeepers
PRO
70
11k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.6k
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 の呼び⽅呼ばれ⽅のコードというよりは 遅延時間やジョブの衝突などの⽅で、こ れは⾮常にテストしにくい
(機会があれば) 頑張ります><