Использование Heroku и Resque в разных приложениях - PullRequest
0 голосов
/ 07 июля 2011

Моя цель состоит в том, чтобы главное приложение добавляло задания в очередь Resque на Heroku. Однако я хочу, чтобы рабочие запускались в разных приложениях.

Могу ли я поставить в очередь задание в приложении для выполнения другим приложением (работником)? Есть ли учебник, объясняющий, как это сделать?

Спасибо

Ответы [ 2 ]

1 голос
/ 07 июля 2011

Resque будет использовать любой экземпляр Redis, на который вы указываете.В Heroku это, вероятно, будет экземпляр из отдельного сервиса Redis To Go.Вам просто нужно написать свой установочный код Resque, чтобы он указывал на общий экземпляр Redis.

From 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 использует конфигурацию heroku: добавьте REDISTOGO = и т. д.

0 голосов
/ 14 июля 2011

Это заботится об окружающей среде, обычно на Heroku, который вы запускаете с RedisToGo:

# 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 и потребуйте файл из инициализатора восстановления:

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

...