为给定的重新队列定义ActiveRecord连接 问题域
Heroku Cedar stack,具有多个数据库。RDS用于主数据库,Postgres用于第二个分析数据库。服务器使用读/写RDS和Postgres数据库运行。夜间rake任务在不同的环境中运行,需要在RDS数据库的只读从机中运行特定的Resque队列 Postgres数据库连接 记录在案,Postgres数据库中的所有模型包括:为给定的重新队列定义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
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://xxxxxxxxxxxxENV['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://xxxxxxxxxxxxENV['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初始化中分叉的。我们在每个作业的基础上有效地完成了这个显式连接定义