告诉Sidekiq使用所有可用的Heroku工人

zujrkrfu  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(122)

我需要尽快地批处理一大组文件(数百万条数据库记录)。为此,我将文件分成3个目录,并使用标准配置(没有配置文件)设置Sidekiq。
然后我启动了3个Heroku工作线程,并调用了3个方法,这3个方法启动了3个Sidekiq工作线程,所有的线程都使用“默认”队列。
我如何才能迫使Sidekiq使用所有3个工人来尽快完成工作?
谢谢

nc1teljy

nc1teljy1#

我在本页底部找到了解决方案:http://manuelvanrijn.nl/blog/2012/11/13/sidekiq-on-heroku-with-redistogo-nano/

# app/config/sidekiq.yml
:concurrency: 1

# Procfile    
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
worker: bundle exec sidekiq -e production -C config/sidekiq.yml

另外,如果你有很多worker和一个免费/便宜的Redis示例,请确保限制每个worker到Redis服务器的连接数:

# app/config/initializers/sidekiq.rb
require 'sidekiq'

Sidekiq.configure_client do |config|
  config.redis = { :size => 1 }
end

Sidekiq.configure_server do |config|
  config.redis = { :size => 2 }
end

您可以在此处计算最大连接数:http://manuelvanrijn.nl/sidekiq-heroku-redis-calc/

nbewdwxp

nbewdwxp2#

我想澄清一下你的问题。你的问题是“告诉Sidekiq使用所有可用的Heroku工作线程”。事实上,对于每个Dyno,一个Sidekiq进程将使用类似bundle exec sidekiq -e production -C config/sidekiq.yml的命令执行。每个Sidekiq进程都可以处理config/sidekiq.yml文件中指定的多个线程,其中一行类似于::concurrency: 3,这是Sidekiq文档推荐的Heroku标准-2x dyno(阅读此处了解更多细节https://github.com/mperham/sidekiq/wiki/Heroku),它只有1GB的内存。
但是从技术上讲,您不需要告诉Sidekiq使用所有可用的Heroku进程,其中还有另一个关键因素,这是Redis服务器。我们的主应用程序会将消息发布到Redis服务器上。每个在Dyno上运行的Sidekiq进程都可以配置相同的队列,这样所有的进程都订阅了Redis队列,并从队列中提取消息。这一点在Sidekiq github页面上由Sidekiq的创建者清楚地说明:是的。
分担负载有两个关键点:第一,限制一个给定的Sidekiq进程的并发数,就像我上面提到的那样;第二,你也可以限制从Sidekiq.configure_client到Redis服务器的连接;最后,Heroku负载平衡与AWS中ALB的工作方式有些不同。ALB是一种循环调度,它根据启动模板和自动扩展组中定义的某些指标(如vCPU利用率)将流量分配给目标组中的示例。这里的负载平衡更像是一个发布-订阅系统,在这个系统中,Sidekiq示例在它们能够工作的时候,根据它们对并发和连接到Redis服务器的限制来工作。
最后,Heroku不鼓励长时间运行的作业。作业运行的时间越长,消耗的内存量就越大。Heroku dynos价格昂贵。在相同的vCPU和内存条件下,标准的2倍是AWS中t3.micro成本的4倍此外,在AWS中,您可以创建一个现货舰队,您以按需价格的10%购买计算,然后将这些现货示例作为批处理作业执行。实际上,AWS也有一个叫做AWS Batch的服务。Heroku中不存在现货车队选项。因此,记住价格和作业运行的时间是很重要的。请阅读本文,Heroku描述了为什么在Heroku环境中运行长时间运行的作业是不好的:https://devcenter.heroku.com/articles/scaling#understanding-concurrency。尽量将作业时间控制在2分钟以内。

相关问题