Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为给定的重新队列定义ActiveRecord连接 问题域_Activerecord_Heroku_Resque - Fatal编程技术网

为给定的重新队列定义ActiveRecord连接 问题域

为给定的重新队列定义ActiveRecord连接 问题域,activerecord,heroku,resque,Activerecord,Heroku,Resque,Heroku Cedar stack,具有多个数据库。RDS用于主数据库,Postgres用于第二个分析数据库。服务器使用读/写RDS和Postgres数据库运行。夜间rake任务在不同的环境中运行,需要在RDS数据库的只读从机中运行特定的Resque队列 Postgres数据库连接 记录在案,Postgres数据库中的所有模型包括: module Trove::PostgresConnection def self.included(base) base.class_eval do

Heroku Cedar stack,具有多个数据库。RDS用于主数据库,Postgres用于第二个分析数据库。服务器使用读/写RDS和Postgres数据库运行。夜间rake任务在不同的环境中运行,需要在RDS数据库的只读从机中运行特定的Resque队列

Postgres数据库连接 记录在案,Postgres数据库中的所有模型包括:

module Trove::PostgresConnection
  def self.included(base)
    base.class_eval do
      …set up Postgres database
    end
  end
end
这可以很好地工作,并且作为注入到每个类中的模块,不会被对ActiveRecord::Base.connection的任何更改压扁

MySQL连接 使用Heroku RDS插件定义。连接到读/写生产数据库。不幸的是,无论环境如何,都会使用此连接。因此,在Heroku上使用
RAILS\u ENV=analytics rake some:task
运行rake任务不会将此连接用于
ActiveRecord::Base

analytics:
  adapter: mysql2
  encoding: utf8
  database: dbase
  username: uname
  password: pword
  host: read-only.uri.on.amazonaws.com
  reconnect: true
  port: 3306
而是使用RDS连接中提供的连接字符串:

puts Rails.env
-> 'analytics'
puts SomeModel.connection_config[:host]
-> read-write.uri.on.amazonaws.com
我花了一段时间才弄明白。自我提醒:不要只看环境,要看数据库主机

当前解决方法 期望能力 在proc文件中有类似的内容

troveworker:    env RAILS_ENV=analytics QUEUE=trove_queue bundle exec rake resque:work

它实际使用该工作人员的analytics database.yml配置。我们目前使用这个Procfile运行服务器,但它仍然使用RDS数据库。

我只玩过Heroku,但我认为数据库连接信息被Heroku工具根据Heroku工具带指定的环境变量覆盖。

我只玩过Heroku,但是我认为数据库连接信息是由Heroku工具根据Heroku工具带指定的环境变量覆盖的。

这里的问题是Heroku生成自己的database.yml文件:

通过使用Amazon RDS插件,Heroku设置了一个
数据库URL
环境变量。通过从应用程序目录的根目录运行以下命令,可以查看其内容:
heroku配置

另外,从Rails 3.2开始,它将使用
DATABASE\u URL
env var(如果设置)而不是DATABASE.yml文件:

最简单的解决方法可能是:

  • 创建一个名为
    DATABASE\u URL\u ANALYTICS
    w/Postgres连接字符串的环境变量: heroku配置:添加数据库\u URL\u分析=postgres://xxxxxxxxxxxx

  • 在rake文件的开头(在任何rails初始化之前),添加:
    ENV['DATABASE\u URL']=ENV['DATABASE\u URL\u ANALYTICS']if Rails.ENV.ANALYTICS?


  • 这里的问题是Heroku生成自己的database.yml文件:

    通过使用Amazon RDS插件,Heroku设置了一个
    数据库URL
    环境变量。通过从应用程序目录的根目录运行以下命令,可以查看其内容:
    heroku配置

    另外,从Rails 3.2开始,它将使用
    DATABASE\u URL
    env var(如果设置)而不是DATABASE.yml文件:

    最简单的解决方法可能是:

  • 创建一个名为
    DATABASE\u URL\u ANALYTICS
    w/Postgres连接字符串的环境变量: heroku配置:添加数据库\u URL\u分析=postgres://xxxxxxxxxxxx

  • 在rake文件的开头(在任何rails初始化之前),添加:
    ENV['DATABASE\u URL']=ENV['DATABASE\u URL\u ANALYTICS']if Rails.ENV.ANALYTICS?


  • 为了进一步阐述我对这个问题的评论,我的意思是为数据库添加一个配置“Heroku方式”,然后在Procfile中为将处理该队列上的作业的一个工作者引用它

    使用新名称添加一个配置/环境变量和所需的DB config:

    heroku config:add ANALYTICS_DB=postgres://some_url
    
    在您的
    程序文件中,根据您想要的示例:

    troveworker:    env DATABASE_URL=$(ANALYTICS_DB) QUEUE=trove_queue \
                    bundle exec rake resque:work
    

    通过这种方式,您必须为每个队列使用不同配置的单独工作程序,但该配置至少不在代码范围内。

    要扩展我对这个问题的评论,我的意思是为您的DB添加一个配置“Heroku方式”,然后在Procfile中为处理该队列上作业的一个工作程序引用它

    使用新名称添加一个配置/环境变量和所需的DB config:

    heroku config:add ANALYTICS_DB=postgres://some_url
    
    在您的
    程序文件中,根据您想要的示例:

    troveworker:    env DATABASE_URL=$(ANALYTICS_DB) QUEUE=trove_queue \
                    bundle exec rake resque:work
    
    通过这种方式,您必须为每个队列使用不同配置的单独工作线程,但配置至少会超出代码范围。

    Update:Not working。(保留原始答案以备记录) 我们就是这样解决的:

    程序文件:

    troveworker:    env RAILS_ENV=analytics QUEUE=trove_queue rake trove:worker
    
    lib/tasks/trove.rake:

    desc 'Start the Resque workers in the proper environment'
    task :worker do
      SwapConnection.with_connection_to Rails.env do
        Rake::Task['resque:work'].invoke
      end
    end
    
    这个解决方案也为我们解决了一些其他问题,并且运行得非常好。谢谢大家。

    更新:不工作。(保留原始答案以备记录) 我们就是这样解决的:

    程序文件:

    troveworker:    env RAILS_ENV=analytics QUEUE=trove_queue rake trove:worker
    
    lib/tasks/trove.rake:

    desc 'Start the Resque workers in the proper environment'
    task :worker do
      SwapConnection.with_connection_to Rails.env do
        Rake::Task['resque:work'].invoke
      end
    end
    

    这个解决方案也为我们解决了一些其他问题,并且运行得非常好。谢谢大家。

    黑暗中拍摄。。。您的应用程序正在从环境变量(yay-Heroku!)获取RDS配置,您可以这样使用其他值吗?是的,就是这样。我的观点是,当40万个作业被抛出队列时,我不想在每个作业的基础上改变这一点。我想说“对于整个队列,对所有工作人员使用此数据库字符串。”我似乎不能。在黑暗中拍摄。。。您的应用程序正在从环境变量(yay-Heroku!)获取RDS配置,您可以这样使用其他值吗?是的,就是这样。我的观点是,当40万个作业被抛出队列时,我不想在每个作业的基础上改变这一点。我希望能够说“对于整个队列,将此数据库字符串用于所有工作人员。”我似乎无法做到。我们的rake任务启动多个作业,有些是只读的,有些是写的。rake文件的环境不会影响Resque作业的环境,因为它们是在自己的Rails初始化中分叉的。我们在每个作业的基础上有效地完成了这个显式连接定义