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

问题描述 投票:9回答:2

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

我正在使用sidekiq 3.3

sidekiq
2个回答
3
投票

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

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

在Procfile中为一个队列设置了[SIDEKIQ_WORKERS_PROCFILE-其他队列使用在Heroku设置中设置的SIDEKIQ_WORKERS

我不确定这是否会对您的情况有所帮助。

更新

为了澄清这一点,这个想法涉及在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工作程序将SIDEKIQ_WORKERS_PROCFILE变量设置为1-这使得可以在具有不同并发性的队列中运行工作程序。该变量由sidekiq.rb初始化程序读取。请注意,还有-c 1选项-但是我不知道这是否重要。

初始值设定项已经在那里。

全部设置完毕,并在sidekiq仪表板中,我看到matrices队列正在运行1个线程,而其他线程则使用3(在Heroku设置环境变量中SIDEKIQ_WORKERS变量设置为3):

enter image description here


1
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.