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

Tal*_*Tal 9 sidekiq

Sidekiq文档表明我只能控制sidekiq的全局并发性,而不是每个队列.我在这里提出一个问题,希望有一个针对每队列并发设置的解决方案.一些第三方服务只是不接受高并发性,并且限制整个sidekiq只是为了那些是痛苦的.

我在sidekiq 3.3

Jar*_*red 5

使用 Heroku,我能够通过在 Procfile 中设置环境变量然后在sidekiq.rb初始化程序中使用它来控制每个队列的并发性:

Sidekiq.configure_server do |config|
 config.options[:concurrency] = (ENV['SIDEKIQ_WORKERS_PROCFILE'] || ENV['SIDEKIQ_WORKERS'] || 1).to_i
 ...
end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

您可以看到matricesworker 的SIDEKIQ_WORKERS_PROCFILE变量设置为 1 - 这使得使用具有不同并发性的队列运行 worker 成为可能。该变量由sidekiq.rb初始化程序读取。请注意,还有一个-c 1选项 - 我不知道这是否重要。

初始化程序已经在那里了。

所有设置和 sidekiq 仪表板中,我可以看到matrices队列正在运行 1 个线程,而其他线程使用 3 个(SIDEKIQ_WORKERS变量在 Heroku 设置环境变量中设置为 3):

在此处输入图片说明


Dav*_*mpy 5

Sidekiq 企业版增强了并发控制:

https://github.com/mperham/sidekiq/wiki/Ent-Rate-Limiting

特别是,您可以按计数或间隔限制任意作业的并发性。例如,一次最多 20 个作业;或最多 20 个作业(60 秒/1 小时等)。该间隔可以是滚动的或时钟对齐的。

这可以通过正确的用法满足您所询问的每个队列控制。但它可以更加灵活,通过您自己的分组来控制并发。例如,您可以指定每秒最多 30 个作业可以访问 PayPal。或者,您可以指定每个州每秒 30 个作业可以访问 Paypay,每个州可以同时有 15 个作业访问 Stripe。(当然,假设“状态”是数据中的一个属性。)

您想要定义组的细粒度是没有限制的。