sidekiq - 如何控制每个队列的并发性?

标签 sidekiq

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

enter image description here

关于sidekiq - 如何控制每个队列的并发性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28792190/

相关文章:

ruby-on-rails - 减少sidekiq作业的执行时间

ruby-on-rails - Sidekiq 不排队作业

ruby-on-rails - 大型 Rails 后台进程未完成的问题

ruby-on-rails - 日志中的 Sidekiq 堆栈跟踪

ruby-on-rails - 通过heroku上的sidekiq导入csv的file.path问题

ruby-on-rails - Rails 5.2 和 Sidekiq : Can't find Worker Class

ruby-on-rails - Sidekiq 仅在生产环境中重试

ruby-on-rails - 包装 Sidekiq 的执行方法以添加时区感知

ruby-on-rails - 优化 Sidekiq、Redis、Heroku 和 Rails

ruby-on-rails - Sidekiq - 如何立即执行作业(+在这种情况下使用队列有意义)?