Sidekiq 文档建议我只能控制 sidekiq 的全局并发性,而不是每个队列。我在这里提出一个问题,希望有一个针对每个队列并发设置的解决方案。一些 3rd 方服务就是不接受高并发性,并且仅仅为了那些而限制整个 sidekiq 是痛苦的。
我在 sidekiq 3.3
最佳答案
使用 Heroku,我能够通过在 Procfile 中设置环境变量然后在 sidekiq.rb
中使用它来控制每个队列的并发性。初始化程序:
Sidekiq.configure_server do |config|
config.options[:concurrency] = (ENV['SIDEKIQ_WORKERS_PROCFILE'] || ENV['SIDEKIQ_WORKERS'] || 1).to_i
...
end
SIDEKIQ_WORKERS_PROCFILE
在 Procfile 中为一个队列设置 - 其他队列使用 SIDEKIQ_WORKERS
这是在 Heroku 设置中设置的。不过,我不确定这是否对您的场景有帮助。
更新
为了澄清这一点,这个想法涉及在 Heroku 上部署,每个队列都在单独的 dyno 中处理。 这使它仍然使用全局 sidekiq 并发设置,dynos 只是在我的用例中完成工作的一种解决方法。
我的
Procfile
看起来像这样:web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
default: env HEROKU_PROCESS=default bundle exec sidekiq -c 5
important: env HEROKU_PROCESS=important bundle exec sidekiq -q important -c 5
instant: env HEROKU_PROCESS=instant bundle exec sidekiq -q instant -c 5
matrices: env HEROKU_PROCESS=matrices SIDEKIQ_WORKERS_PROCFILE=1 bundle exec sidekiq -q matrices -c 1
您可以看到
matrices
worker 有 SIDEKIQ_WORKERS_PROCFILE
变量设置为 1 - 这使得可以使用具有不同并发性的队列运行工作程序。该变量由 sidekiq.rb
读取初始化程序。请注意,还有 -c 1
选项 - 但是我不知道这是否重要。初始化程序已经在那里了。
全部设置完毕,在 sidekiq 仪表板中我可以看到
matrices
queue 正在运行 1 个线程,而其他使用 3 个(SIDEKIQ_WORKERS
变量在 Heroku 设置环境变量中设置为 3):关于sidekiq - 如何控制每个队列的并发性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28792190/