gpt4 book ai didi

ruby-on-rails - 在 Heroku 上使用 Resque 的后台作业

转载 作者:行者123 更新时间:2023-12-04 06:22:58 25 4
gpt4 key购买 nike

我在 Heroku 上遇到了一个非常奇怪的问题,我一直在努力解决这个问题。

我的应用程序有一些外部 API 调用和邮件程序,我已将 ActiveJob 设置为在后台运行。在 Heroku 上,我有两个工作人员设置为,并且我按照以下代码段使用 Resque/Redis 组合来处理工作。我在 Heroku 上使用 Redis Cloud 插件。

配置/设置

文件

web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 QUEUE=* bundle exec rake resque:work

lib/tasks/resque.rake
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

配置/初始化程序/active_job.rb
Rails.application.config.active_job.queue_adapter = :resque

配置/初始化程序/redis.rb
if ENV["REDISCLOUD_URL"]
$redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end

配置/初始化程序/resque.rb
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

问题

我遇到的问题是,当用户在浏览器中使用该应用程序(即与 Web worker 交互)并执行触发其中一个 ActiveJob 作业的操作时,该作业使用 web“内联”运行。 worker 而不是 resque worker 。当我在 Heroku 应用程序控制台(通过运行 heroku run rails console 打开)中运行将作业排队的特定模型方法时,它会将作业添加到 Redis 并使用 resque 运行它。 worker 如预期。

为什么一种方式可以正常工作而另一种方式不起作用?我已经查看了关于该主题的几乎所有教程/SO 问题,并尝试了所有方法,因此任何帮助都可以运行作业,但正确的 worker 会很棒!

提前致谢!

最佳答案

我设法通过使用我的配置来解决这个问题。似乎 Action 是通过 ActiveJob 的“内联”默认值而不是通过 Resque 进行隧道传输的。为了让事情正常工作,我只需要直接 Resque.redis等于 $redisconfig/initializers/redis.rb 中设置的变量所以一切都指向同一个Redis实例,然后移动config/initializers/active_job.rb中的配置集至 application.rb .

作为引用,所有工作的新的和改进的配置是:

配置/设置

文件

web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 QUEUE=* bundle exec rake resque:work

lib/tasks/resque.rake
require "resque/tasks"

task "resque:setup" => :environment

配置/应用程序.rb
module App
class Application < Rails::Application
...

# Set Resque as ActiveJob queue adapter.
config.active_job.queue_adapter = :resque
end
end

配置/初始化程序/redis.rb
if ENV["REDISCLOUD_URL"]
$redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end

配置/初始化程序/resque.rb
Resque.redis = Rails.env.production? ? $redis : "localhost:6379"

关于ruby-on-rails - 在 Heroku 上使用 Resque 的后台作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36612686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com