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

时间:2015-03-01 09:56:27

标签: sidekiq

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

我在sidekiq 3.3

4 个答案:

答案 0 :(得分:2)

使用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_CONCURRENCY=1 bundle exec sidekiq -q matrices -c 1

您可以看到matrices worker将SIDEKIQ_CONCURRENCY变量设置为1 - 这使得可以使用具有不同并发性的队列来运行worker。该变量由sidekiq.rb初始值设定项读取。请注意,还有-c 1选项 - 但我不知道这是否重要。

初始化程序已经存在。

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

enter image description here

答案 1 :(得分:0)

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

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

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

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

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

答案 2 :(得分:0)

要处理按队列的并发,可以使用此gem sidekiq-limit-fetch。 修复了队列可以使用的最大线程数。

答案 3 :(得分:0)

我只是从 yml 文件中删除并发性,并在启动工作程序时更改它。

sidekiq.yml

:queues:
  - default
  - long_running

我在 docker 环境中运行我的工人。我只是为每个队列运行单独的工作人员:

默认工作器以

开头
sidekiq -q default -c 5

长时间运行的工人以

sidekiq -q long_running -c 2

或者,您可以拥有单独的 yml 配置并使用 -C 选项传递不同的配置