我需要尽快地批处理一大组文件(数百万条数据库记录)。为此,我将文件分成3个目录,并使用标准配置(没有配置文件)设置Sidekiq。然后我启动了3个Heroku工作线程,并调用了3个方法,这3个方法启动了3个Sidekiq工作线程,所有的线程都使用“默认”队列。我如何才能迫使Sidekiq使用所有3个工人来尽快完成工作?谢谢
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/
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分钟以内。
bundle exec sidekiq -e production -C config/sidekiq.yml
config/sidekiq.yml
:concurrency: 3
Sidekiq.configure_client
2条答案
按热度按时间nc1teljy1#
我在本页底部找到了解决方案:http://manuelvanrijn.nl/blog/2012/11/13/sidekiq-on-heroku-with-redistogo-nano/
另外,如果你有很多worker和一个免费/便宜的Redis示例,请确保限制每个worker到Redis服务器的连接数:
您可以在此处计算最大连接数:http://manuelvanrijn.nl/sidekiq-heroku-redis-calc/
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分钟以内。