Sidekiq 是一個提供了執(zhí)行 定時/異步 任務的后臺任務處理系統(tǒng),它可以集成在 Rails 項目中使用聪蘸,也可以單獨的使用宪肖。在本篇文章中,我們將對如何在 Rails 中使用 Sidekiq 進行介紹和分析健爬。
添加依賴
目前 Sidekiq 已經(jīng)更新到 6.0 版本了控乾,這里我們使用最新的版本
$ gem install sidekiq
gem 'sidekiq', '~> 6.0', '>= 6.0.3'
修改配置
添加 config/sidekiq.yml
文件
# 最大并發(fā)數(shù)
concurrency: 5
# 進程和日志的輸出位置
pidfile: tmp/pids/sidekiq.pid
logfile: log/sidekiq.log
# 任務隊列
queues:
- default
- schedule
development:
concurrency: 5
staging:
concurrency: 10
production:
concurrency: 20
添加 config/initializers/sidekiq.rb
文件
# 設(shè)置 sidekiq cron 每秒鐘檢查一次任務,默認是 15 秒鐘檢查一次任務
Sidekiq.options[:poll_interval] = 1
Sidekiq.options[:poll_interval_average] = 1
# 設(shè)置 sidekiq 服務端
Sidekiq.configure_server do |config|
# 配置 redis 連接
config.redis = { url: "redis://localhost:6379/0" }
# 設(shè)置 sidekiq 每秒鐘都會檢查一次作業(yè)(默認每5秒檢查一次)
config.average_scheduled_poll_interval = 1
# 從配置文件中讀取定時任務
schedule_file = 'config/sidekiq_schedule.yml'
if File.exists?(schedule_file)
Sidekiq::Cron::Job.load_from_hash YAML.load_file(schedule_file)
end
end
Sidekiq.configure_client do |config|
config.redis = { url: "redis://localhost:6379/0" }
end
在 config/application.rb
中設(shè)置配置項:
config.active_job.queue_adapter = :sidekiq # 使用 sidekiq 作為異步任務的適配器
異步任務
使用生成器來創(chuàng)建一個發(fā)送消息的任務:
$ rails g job SendMessage
上面的命令將會創(chuàng)建 app/jobs/send_message_job.rb
class SendMessageJob < ActiveJob::Base
queue_as :default
def perform(*args)
Rails.logger.info "send message..."
end
end
如何使用:
SendMessageJob.perform_async(xxx, xxx, xxx) # 創(chuàng)建異步作業(yè)
SendMessageJob.perform_in(1.minutes, xxx, xxx) # 創(chuàng)建延時異步作業(yè)
SendMessageJob.perform_at(1.minutes.from_now, xxx, xxx) # 指定時間創(chuàng)建異步作業(yè)
定時任務
添加 app/worker/send_message_worker.rb
文件
class SendMessageWorker
include Sidekiq::Worker
sidekiq_options queue: :schedule, backtrace: true, retry: false
# 無需顯示調(diào)用娜遵,sidekiq 運行后會自動執(zhí)行
# 傳入?yún)?shù)和執(zhí)行周期在 config/sidekiq_schedule.yml 中配置
def perform(*args)
Rails.logger.info 'every second execution...'
end
end
添加 config/sidekiq_schedule.yml
配置文件
SendMessageWorker:
cron: '* * * * * *'
class: SendMessageWorker
通過 sidekiq -C config/sidekiq
命令啟動蜕衡,定時任務將會周期的執(zhí)行
配置監(jiān)控
sidekiq 在 4.2 以上版本已經(jīng)內(nèi)置了一套監(jiān)控頁面,在 4.2 以前的版本需要添加額外的依賴:
gem 'sinatra', '~> 2.0', '>= 2.0.7'
在 config/router.rb
文件中掛載 WebUI 頁面的路由设拟。
require 'sidekiq/web'
Rails.application.routes.draw do
mount Sidekiq::Web => '/sidekiq'
end
rails s
啟動項目 sidekiq -C config/sidekiq.yml
啟動 sidekiq慨仿,訪問 http://localhost:3000/sidekiq