Sidekiq
Table of Contents
1. 配置redis
配置sidekiq所依赖的redis位置,必须同时定义sidekiq的server和client
server
- config/initializers/sidekiq.rb
这里的地址和端口号(6379)都需要配置成正确的
Sidekiq.configure_server do |config| config.redis = { url: 'redis://127.0.0.1:6379/12' } #标准格式 config.redis = { url: "redis://#{redis_server}:#{redis_port}/#{redis_db_num}", namespace: redis_namespace } end Sidekiq.configure_client do |config| config.redis = { url: 'redis://127.0.0.1:6379/12' } #标准格式 config.redis = { url: "redis://#{redis_server}:#{redis_port}/#{redis_db_num}", namespace: redis_namespace } end
如果要使用 UNIX socket,URL 应该类似于 unix://#{Rails.root}/tmp/sockets/redis.sock
client
配置config/sidekiq.yml文件,一般只有在需要配置高级选项的时候才需要配置这个文件(如果不使用这个名字,可以使用-c指定 sidekiq -c config/name.yml)
:verbose: false :concurrency: 5 # 并发数 :pidfile: ./tmp/pids/sidekiq.pid :logfile: ./log/sidekiq.log # 输出的日志地址 :timeout: 30 :queues: - default # 写在队列参数中的, 表示让 sidekiq 处理这个 queue - [HardWorker, 2] # 使用数组的形式写, 第一个参数为打开的 queue 的名称, 第二个为优先级 - [EmailWorker, 3] - [PasswordWorker, 4] development: :concurrency: 5 staging: :concurrency: 10 production: :concurrency: 5
3. gemfile中添加对应的包
- gem 'sidekiq', '4.0.1'
4. 在app/jobs文件下新建一个job,来处理异步请求(可以使用命令也可以手动创建)
rails g job add_lots_of_users #rails g sidekiq:worker Hard # will create app/workers/hard_worker.rb #在app/workers文件下新建一个worker,来处理异步请求(可以使用命令也可以手动创建)
文件中会生成如下内容
class AddLotsOfUsersJob < ApplicationJob queue_as :default def perform(*args) # Do something later sleep 10 10.times do |index| o = Article.new o.name = "atpking#{index}" o.title = "lots#{index}" o.save end end end
5. 在需要的地方controller或者model中调用,调用示例如下
注意:perform是一个实例方法,但是在调用的时候是用类调用
AddLotsOfUsersJob.perform_later #常规异步执行 AddLotsOfUsersJob.set( wait: 20.minutes ).perform_later #指定延迟多久执行 @users = User.all #HardWorker.perform_async('bob', 5) #常规异步执行 #HardWorker.perform_in(5.minutes, 'bob', 5) #延迟执行 #User.delay.do_some_stuff(current_user.id, 20) # 也可以通过 delay 来新建任务
6. 在config/application.rb中指定active_job的adapter
adapter默认使用的adapter是Active Job Inline需要指定为sidekiq才支持异步(如果是使用worker这一步可以省略)
config.active_job.queue_adapter = :sidekiq
7. 在rails项目的根目录启动sidekiq
bundle exec sidekiq -d -C config/sidekiq.yml #-d是指后台运行 -c指定配置文件,默认sidekiq.yml文件