Sidekiq Github wiki 中文文档
高级选项
commit信息:Updated Advanced Options (markdown) | 提交者:mperham | 提交时间:2020-05-08 | 版本:62b33d0
Sidekiq 配置文件
Sidekiq配置文件是YAML格式文件,Sidekiq 服务使用这个文件来配置它自己,默认位于config/sidekiq.yml
。如果你需要设置高级选项,像并发池大小,命名队列,PID文件存放位置等等,需要创建这个文件。这里有一个配置文件例子:
---
:concurrency: 5
staging:
:concurrency: 10
production:
:concurrency: 20
:queues:
- critical
- default
- low
注意:特定环境subsections的使用。这些值将覆盖顶层值。如果你不想使用默认的位置存放配置文件,请使用-C
标志来告诉Sidekiq配置文件在哪里:
sidekiq -C config/myapp_sidekiq.yml
在命令行中传递的选项也将覆盖配置文件里相同的选项。
队列
默认,Sidekiq使用在Redis中名为"default"的简单队列。如果你想使用多种队列,你可以将它们指定为sidekiq
命令的参数,或者在Sidekiq配置文件中设置它们。每个队列可以配置一个权重选项。一个2权重的队列检查频率是1权重队列的两倍:
参数形式...
sidekiq -q critical,2 -q default
在配置文件中...
# ...
:queues:
- [critical, 2]
- default
如果你想队列总是按特定的顺序执行,只需按顺序并且不带权重选项的声明它们:
参数形式...
sidekiq -q critical -q default -q low
在配置文件中...
# ...
:queues:
- critical
- default
- low
这意味着任何在default队列中的作业只有在critical队列内作业都执行完时才会被执行。
通过给每一个队列声明1权重,你可以设置随机队列,使每个队列有相同的被执行机率。
# ...
:queues:
- ["foo", 1]
- ["bar", 1]
- ["xyzzy", 1]
通过在Worker里声明队列,你可以给该Worker指定一个特定的队列:
class ImportantWorker
include Sidekiq::Worker
sidekiq_options queue: 'critical'
def perform(*important_args)
puts "Doing critical work"
end
end
我不建议队列过多。太多的队列会使系统太复杂,并且如果不使用轮询,Sidekiq Pro 不能可靠的支持太多的队列。M个Sidekiq Pro进程轮询N个队列意味着每秒O(M*N)次操作,这会给Redis带来很大压力。
如果你使用sidekiq web 接口,当一个作业入队该队列时,新添加的队列才会首次出现。
预留队列
如果你想要“预留”一个队列来支持某些特定作业,最简单的方法是运行两个sidekiq runner,每一个支持不同的队列:
sidekiq -q critical # Only handles jobs on the "critical" queue
sidekiq -q default -q low # Handles the other jobs
Workers
Sidekiq提供了许多选项来控制worker的行为。
- queue: 让Worker使用命名队列,默认是
default
- retry: 提供给Worker重试选项,默认是
true
。 另外,你可以设置一个作业的最大重试次数(例如,retry: 3) - dead: 一个所有重试都失败的作业是否因该进入Dead 队列,default: true
- backtrace: 是否保存重试负载中的任何错误回朔以便在Web UI中显示它们,可以是true,false或者一个整数(储存多少行回朔),默认是
false
。 小心,回朔通常很大,当你有大量的重试作业时会占用大量的Redis的空间。你应该使用像Honeybadger这样的错误服务。 - pool: 设置Redis连接池,以便作业间共享这些链接.
这些是被支持的开箱即用的选项。
class HardWorker
include Sidekiq::Worker
sidekiq_options queue: :crawler, retry: false, backtrace: true
def perform(name, count)
end
end
可以使用Sidekiq.default_worker_options=
来设置所有worker的默认的选项:
Sidekiq.default_worker_options = { 'backtrace' => true }
在每一次调用时还可以覆盖选项:
HardWorker.set(queue: :critical).perform_async(name, count)
并发
你可以调整你的Sidekiq进程的总并发数。默认,一个sidekiq进程创建10个线程。如果并发使你的机器I/O承压,你可以调低它:
bundle exec sidekiq -c 5
RAILS_MAX_THREADS=3 bundle exec sidekiq
我不推荐设置超过50的并发。从Rails 5开始,RAILS_MAX_THREADS
可以设置Rails和Sidekiq的并发数。注意:为了在高并发情况下工作良好,ActiveRecord的连接池需要在config/database.yml
中被正确配置。请设置pool
等于线程数。
production:
adapter: mysql2
database: foo_production
pool: <%= ENV['RAILS_MAX_THREADS'] || 10 %>
链接池
Sidekiq包含Worker可以使用的connection_pool gem。使用连接池,可以在大量线程之间共享有限数量的I/O连接。
class HardWorker
include Sidekiq::Worker
MEMCACHED_POOL = ConnectionPool.new(size: 10, timeout: 3) { Dalli::Client.new }
def perform(args)
MEMCACHED_POOL.with do |dalli|
dalli.set('foo', 'bar')
end
end
end
这样可以确保即使有很多并发,每个Sidekiq进程也只有10个可用于memcached的连接。
环境
Sidekiq允许你使用 -e production
, RAILS_ENV=production
或者 APP_ENV=production
来控制当前环境。APP_ENV很不错,因为这个名字不太涉及特定的技术(不像RAILS_ENV 或是 RACK_ENV)。