sidekiq
是一套可以用來實作 background job 的 gem
舉凡長時間的執行如 email, 點數計算等等非即時性的工作, 都可以採用非同步執行
以加速前端服務的反應速度或減低主機負荷
和 resque
一樣,sidekiq
是以 redis 做為 Message Queue
來運作…
安裝
本教學所使用的版本是 2.12.1
Gemfile1
| gem "sidekiq", "~> 2.12.1"
|
設定 redis
關於 redis 安裝可參考 http://pm.5fpro.com/projects/public-wiki/wiki/Redis
1
2
3
4
5
6
7
| Sidekiq.configure_server do |config|
config.redis = { :url => "redis://127.0.0.1:6379/0" }
end
Sidekiq.configure_client do |config|
config.redis = { :url => "redis://127.0.0.1:6379/0" }
end
|
使用 (定義 worker)
定義 worker
foo_worker.rb1
2
3
4
5
6
7
| class FooWorker
include Sidekiq::Worker
sidekiq_options :queue => :barbar_queue, :retry => false, :backtrace => true
def perform(name, count)
end
end
|
啟動 worker (-c 代表 concurrency worker 數)
1
| bundle exec sidekiq -c 1
|
把工作丟到 queue 裡
1
| FooWorker.perform_async("haha", 11)
|
這時若有啟動 worker 就會從 redis 把工作抓下來執行
使用 (delay methods)
直接丟到 queue 裡
1
| Bar.delay.some_method("haha", 2)
|
也可以以 instance 丟
1
2
| user = User.find(2)
user.delay.increase_credit(200)
|
延遲至某短時間後再讓 worker 執行
1
| user.delay_for(1.day).increase_credit(200)
|
延遲至某個時間點再給 worker 執行
1
| user.delay_until(3.hour.from_now).increase_credit(200)
|
設定 Web console
Gemfile1
2
| gem 'slim'
gem 'sinatra', '>= 1.3.0'
|
config/routes.rb1
2
3
| require 'sidekiq/web'
...
mount Sidekiq::Web => '/sidekiq'
|
web console 想要綁 devise 登入 (假設 scoep 為 member 且 .is_admin
必須為 true )
(更多可參考 https://github.com/mperham/sidekiq/wiki/Monitoring)
config/routes.rb1
2
3
4
5
6
7
| sidekiq_constraints = lambda{ |request|
request.env['warden'].authenticate!({ :scope => :member }) &&
request.env['warden'].user(:member).is_admin
}
constraints sidekiq_constraints do
mount Sidekiq::Web => '/sidekiq'
end
|
佈署
config/deploy.rb1
2
3
4
| set :sidekiq_cmd, "bundle exec sidekiq"
set :sidekiqctl_cmd, "bundle exec sidekiqctl"
require 'sidekiq/capistrano'
|
config/sidekiq.yml1
2
3
4
5
6
7
8
9
10
| ---
:verbose: false
:concurrency: 1
staging:
:concurrency: 1
production:
:concurrency: 10
:queues:
- [default, 1]
- [mailer, 9]
|
venus
上述設定也可透過 gem venus
完成
參考教學
RailsCast
Official Document