Rails 使用 Sidekiq 背景處理工作

先安裝redis

Mac的話執行以下指令

brew install redis

再來啟動 redis, commamd line 執行

redis-server

啟動後如圖:

螢幕快照 2014-07-07 下午7.12.20.png

安裝 sidekiq

先在Gemfile加上

#Gemfile
gem 'sidekiq'

執行

bundle install

執行sidekiq

bundle exec sidekiq

啟動後如圖:

螢幕快照 2014-07-07 下午7.11.09.png

理論上 這個都正常運作的話,大致上就沒什麼問題了

執行sidekiqe工作

新增 app/workers/ 資料夾, 可以將要執行背景工作的class都放在這裡

假設要做一個Email發信的工作

#/app/workers/mail_sender.rb

class MailSender include Sidekiq::Worker
  def perform(mail_id)
      mail = @mail.find(mail_id)
      # ..
        這裡執行發送的工作
      # ..
  end
end 

在 Controller或是model,可以呼叫以下方法發送程式

MailSender.perform_aysnc(mail_id) # 呼叫perform這個class method但是記得多加上 _async 

4.安裝sidekiq監控界面

sidekiq 提供一個界面可以讓管理者觀看,目前的背景工作的情況,和統計圖表

安裝方法:

在Gemfile加上

gem 'sinatra', require: false
gem 'slim'` 然後 bundle 安裝

然後 記得在route.rb加上

require 'sidekiq/web'
# ...
mount Sidekiq::Web, at: '/sidekiq'

如此只要在您的網站打上

http://[yourdomain_address]/sidekiq

就可進入此界面,圖如下

Sidekiq.png

但是由於安全性的問題, 如果要限定管理員才能查看此頁面呢? 如果有使用devise,且user model 是存放使用者資料的地方 另外如果user model的admin回傳是true的是管理員的話

可以改為如下,如此就只有有認證過的使用者,且是管理員才能觀看/sidekiq

#routes.rb

authenticate :user, lambda { |u| u.admin? } do  
  mount Sidekiq::Web => '/sidekiq'
end

http://sidekiq.org/
http://railscasts.com/episodes/366-sidekiq
http://redis.io/topics/quickstart
http://blog.remarkablelabs.com/2013/01/using-sidekiq-to-send-emails-asynchronously
http://rubyist.marsz.tw/blog/2013-06-08/sidekiq/
https://github.com/mperham/sidekiq/wiki

Leave a Reply

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax