Ruby on rails Heroku上带有Resque的背景作业
我在Heroku上遇到了一个非常奇怪的问题,我一直在努力解决这个问题 我的应用程序有一些外部API调用和邮件程序,我已将ActiveJob设置为在后台运行。在Heroku上,我有两个工人被设置为,我正在使用Resque/Redis组合来完成以下工作。我正在Heroku上使用Redis云插件 配置/设置 ProcfileRuby on rails Heroku上带有Resque的背景作业,ruby-on-rails,heroku,resque,Ruby On Rails,Heroku,Resque,我在Heroku上遇到了一个非常奇怪的问题,我一直在努力解决这个问题 我的应用程序有一些外部API调用和邮件程序,我已将ActiveJob设置为在后台运行。在Heroku上,我有两个工人被设置为,我正在使用Resque/Redis组合来完成以下工作。我正在Heroku上使用Redis云插件 配置/设置 Procfile web: bundle exec puma -C config/puma.rb resque: env TERM_CHILD=1 QUEUE=* bundle exec rake
web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 QUEUE=* bundle exec rake resque:work
require "resque/tasks"
require "resque/scheduler/tasks"
task "resque:setup": :environment do
Resque.before_fork = proc { ActiveRecord::Base.connection.disconnect! }
Resque.after_fork = proc { ActiveRecord::Base.establish_connection }
end
web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 QUEUE=* bundle exec rake resque:work
require "resque/tasks"
task "resque:setup" => :environment
lib/tasks/resque.rake
web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 QUEUE=* bundle exec rake resque:work
require "resque/tasks"
require "resque/scheduler/tasks"
task "resque:setup": :environment do
Resque.before_fork = proc { ActiveRecord::Base.connection.disconnect! }
Resque.after_fork = proc { ActiveRecord::Base.establish_connection }
end
web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 QUEUE=* bundle exec rake resque:work
require "resque/tasks"
task "resque:setup" => :environment
config/initializers/active_job.rb
Rails.application.config.active_job.queue_adapter = :resque
if ENV["REDISCLOUD_URL"]
$redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
if Rails.env.production?
uri = URI.parse ENV["REDISCLOUD_URL"]
Resque.redis = Redis.new(host: uri.host, port: uri.port,
password: uri.password)
else
Resque.redis = "localhost:6379"
end
module App
class Application < Rails::Application
...
# Set Resque as ActiveJob queue adapter.
config.active_job.queue_adapter = :resque
end
end
if ENV["REDISCLOUD_URL"]
$redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
Resque.redis = Rails.env.production? ? $redis : "localhost:6379"
config/initializers/redis.rb
Rails.application.config.active_job.queue_adapter = :resque
if ENV["REDISCLOUD_URL"]
$redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
if Rails.env.production?
uri = URI.parse ENV["REDISCLOUD_URL"]
Resque.redis = Redis.new(host: uri.host, port: uri.port,
password: uri.password)
else
Resque.redis = "localhost:6379"
end
module App
class Application < Rails::Application
...
# Set Resque as ActiveJob queue adapter.
config.active_job.queue_adapter = :resque
end
end
if ENV["REDISCLOUD_URL"]
$redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
Resque.redis = Rails.env.production? ? $redis : "localhost:6379"
config/initializers/resque.rb
Rails.application.config.active_job.queue_adapter = :resque
if ENV["REDISCLOUD_URL"]
$redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
if Rails.env.production?
uri = URI.parse ENV["REDISCLOUD_URL"]
Resque.redis = Redis.new(host: uri.host, port: uri.port,
password: uri.password)
else
Resque.redis = "localhost:6379"
end
module App
class Application < Rails::Application
...
# Set Resque as ActiveJob queue adapter.
config.active_job.queue_adapter = :resque
end
end
if ENV["REDISCLOUD_URL"]
$redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
Resque.redis = Rails.env.production? ? $redis : "localhost:6379"
问题
我遇到的问题是,当用户在浏览器中使用应用程序(即,与web worker交互)并执行一个触发某个活动作业的操作时,作业将使用web
worker而不是resque
worker“内联”运行。当我在我的Heroku应用程序控制台(通过运行Heroku run rails console
打开)中运行将作业排队的特定模型方法时,它会将作业添加到Redis中,并按预期使用resque
工作者运行它
为什么一种方法能正常工作而另一种方法不能工作?我已经看过了几乎每一个关于这个主题的教程/问题,并且尝试了所有的方法,所以任何有助于运行工作的方法,但是正确的工人将是惊人的
提前谢谢 我通过稍微玩一下我的配置来解决这个问题。似乎操作是通过ActiveJob的“内联”默认值而不是通过Resque进行隧道传输的。为了使事情正常运行,我只需将
Resque.redis
设置为等于config/initializers/redis.rb
中设置的$redis
变量,因此所有内容都指向同一个redis实例,然后将config/initializers/active_job.rb
中的配置集移动到application.rb
作为参考,所有工作的新的和改进的配置是:
配置/设置
Procfile
web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 QUEUE=* bundle exec rake resque:work
require "resque/tasks"
require "resque/scheduler/tasks"
task "resque:setup": :environment do
Resque.before_fork = proc { ActiveRecord::Base.connection.disconnect! }
Resque.after_fork = proc { ActiveRecord::Base.establish_connection }
end
web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 QUEUE=* bundle exec rake resque:work
require "resque/tasks"
task "resque:setup" => :environment
lib/tasks/resque.rake
web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 QUEUE=* bundle exec rake resque:work
require "resque/tasks"
require "resque/scheduler/tasks"
task "resque:setup": :environment do
Resque.before_fork = proc { ActiveRecord::Base.connection.disconnect! }
Resque.after_fork = proc { ActiveRecord::Base.establish_connection }
end
web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 QUEUE=* bundle exec rake resque:work
require "resque/tasks"
task "resque:setup" => :environment
config/application.rb
Rails.application.config.active_job.queue_adapter = :resque
if ENV["REDISCLOUD_URL"]
$redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
if Rails.env.production?
uri = URI.parse ENV["REDISCLOUD_URL"]
Resque.redis = Redis.new(host: uri.host, port: uri.port,
password: uri.password)
else
Resque.redis = "localhost:6379"
end
module App
class Application < Rails::Application
...
# Set Resque as ActiveJob queue adapter.
config.active_job.queue_adapter = :resque
end
end
if ENV["REDISCLOUD_URL"]
$redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
Resque.redis = Rails.env.production? ? $redis : "localhost:6379"
config/initializers/resque.rb
Rails.application.config.active_job.queue_adapter = :resque
if ENV["REDISCLOUD_URL"]
$redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
if Rails.env.production?
uri = URI.parse ENV["REDISCLOUD_URL"]
Resque.redis = Redis.new(host: uri.host, port: uri.port,
password: uri.password)
else
Resque.redis = "localhost:6379"
end
module App
class Application < Rails::Application
...
# Set Resque as ActiveJob queue adapter.
config.active_job.queue_adapter = :resque
end
end
if ENV["REDISCLOUD_URL"]
$redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
Resque.redis = Rails.env.production? ? $redis : "localhost:6379"
非常感谢您提供答案。这节省了我很多时间 您的文件中有一个输入错误 这应该是一次恢复,而不是救援
resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 QUEUE=* bundle exec rake resque:work
此外,我还必须再输入一条命令,才能使这些都在生产中发挥作用。希望这对某人有所帮助
heroku ps:scale resque=1 --app appname
此命令将重新设定过程缩放为1 dyno(free)。您也可以在heroku上的仪表板上执行此操作
您可以在heroku文档上阅读更多关于它的内容这似乎只是因为Rails初始值设定项是按字母顺序加载的,因此
redis.rb
是在resque.rb
之前加载的,因此$redis
有一个值。我个人选择了$redis=Resque.redis=redis.new(url:ENV[“REDISCLOUD\u url]”)