私の目標は、メインアプリがHerokuのResqueキューにジョブを追加することです。ただし、ワーカーを別のアプリで実行する必要があります。
他のアプリ(ワーカー)が実行するアプリにジョブをキューに入れることはできますか?それを行う方法を説明するチュートリアルはありますか?
ありがとう
私の目標は、メインアプリがHerokuのResqueキューにジョブを追加することです。ただし、ワーカーを別のアプリで実行する必要があります。
他のアプリ(ワーカー)が実行するアプリにジョブをキューに入れることはできますか?それを行う方法を説明するチュートリアルはありますか?
ありがとう
Resqueは、指定したRedisインスタンスを使用します。Herokuでは、これはおそらく別のサービスRedisToGoのインスタンスになるでしょう。共通のRedisインスタンスを指すようにResqueセットアップコードを記述する必要があります。
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アプリで設定できます。
これにより、環境が処理されます。通常、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
追加のボーナスとして、Gemfilegem '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