0

我的目标是让一个主应用程序将作业添加到 Heroku 上的 Resque 队列。但是,我希望工作人员在不同的应用程序中运行。

我可以将一个应用程序中的工作排入队列以由其他应用程序(工作人员)执行吗?有没有教程解释如何做到这一点?

谢谢

4

2 回答 2

1

Resque 将使用您指向的任何 Redis 实例。在 Heroku 中,这可能是独立服务 Redis To Go 的一个实例。您只需要编写 Resque 设置代码以指向通用 Redis 实例。

来自http://blog.redistogo.com/2010/07/26/resque-with-redis-to-go/

uri = URI.parse(ENV["REDISTOGO_URL"])
Resque.redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)

这将使用环境变量初始化 Resque,您可以使用 heroku config:add REDISTOGO=etc 在每个部署的 Heroku 应用程序中设置该环境变量。

于 2011-07-07T16:23:33.730 回答
0

这会照顾环境,通常在您使用 RedisToGo 运行的 Heroku 上:

# config/initializers/resque.rb
uri = if ENV['REDISTOGO_URL']
  URI.parse(ENV['REDISTOGO_URL'])
else
  Settings.redis.uri
end

Resque.redis = Redis.new(host: uri.host, port: uri.port, password: uri.password)

请记住,如果您使用的是 Cedar 堆栈,则必须在 Procfile 中写入:

worker: bundle exec rake environment resque:work

作为额外的奖励,在您的 Gemfile 中gem 'heroku'并将其放入 lib/heroku_resque_auto_scale.rb 并从您的 resque 初始化程序中要求该文件:

require 'heroku'

module HerokuResqueAutoScale
  module Scaler
    class << self
      @@heroku = Heroku::Client.new(ENV['HEROKU_USER'], ENV['HEROKU_PASS'])

      def workers
        @@heroku.info(ENV['HEROKU_APP'])[:workers].to_i
      end

      def workers=(qty)
        @@heroku.set_workers(ENV['HEROKU_APP'], qty)
      end

      def job_count
        Resque.info[:pending].to_i
      end
    end
  end

  def after_perform_scale_down(*args)
    # Nothing fancy, just shut everything down if we have no jobs
    Scaler.workers = 0 if Scaler.job_count.zero?
  end

  def after_enqueue_scale_up(*args)
    [
      {
        :workers => 1, # This many workers
        :job_count => 1 # For this many jobs or more, until the next level
      },
      {
        :workers => 2,
        :job_count => 15
      },
      {
        :workers => 3,
        :job_count => 25
      },
      {
        :workers => 4,
        :job_count => 40
      },
      {
        :workers => 5,
        :job_count => 60
      }
    ].reverse_each do |scale_info|
      # Run backwards so it gets set to the highest value first
      # Otherwise if there were 70 jobs, it would get set to 1, then 2, then 3, etc

      # If we have a job count greater than or equal to the job limit for this scale info
      if Scaler.job_count >= scale_info[:job_count]
        # Set the number of workers unless they are already set to a level we want. Don't scale down here!
        if Scaler.workers <= scale_info[:workers]
          Scaler.workers = scale_info[:workers]
        end
        break # We've set or ensured that the worker count is high enough
      end
    end
  end
end

信用:https ://gist.github.com/812430

于 2011-07-14T03:29:50.397 回答