Sidekiq文档表明我只能控制sidekiq的全局并发性,而不是每个队列。我在这里提出一个问题,希望有一个针对每队列并发设置的解决方案。一些第三方服务只是不接受高并发性,并且仅仅为那些限制整个sidekiq是痛苦的。
我在sidekiq 3.3
答案 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):
答案 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 选项传递不同的配置