浩文 联系 关于本站 登录 注册

高级选项

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)。

上一篇: 错误支持 下一篇: 计划作业