黃金俠

Ruby on Rails / Rubygems / Javascript / Git

透過 sidekiq 實作背景工作 (background job)

| Comments

sidekiq 是一套可以用來實作 background job 的 gem
舉凡長時間的執行如 email, 點數計算等等非即時性的工作, 都可以採用非同步執行
以加速前端服務的反應速度或減低主機負荷
resque 一樣,sidekiq 是以 redis 做為 Message Queue 來運作…

安裝

本教學所使用的版本是 2.12.1

Gemfile
1
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.rb
1
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

Gemfile
1
2
gem 'slim'
gem 'sinatra', '>= 1.3.0'
config/routes.rb
1
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.rb
1
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.rb
1
2
3
4
set :sidekiq_cmd, "bundle exec sidekiq"
set :sidekiqctl_cmd, "bundle exec sidekiqctl"

require 'sidekiq/capistrano'
config/sidekiq.yml
1
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 完成

1
rails g venus:sidekiq

參考教學

RailsCast
Official Document

Comments