我们的应用程序部署在Heroku上,使用Unicorn和主从数据库配置,所有应用程序请求(读取和写入)都将发送到主数据库。
我们需要的是将一些read
流量重定向到关注者(从属)数据库。
为实现这一目标,我们添加了read_only_database_connection.rb
-
class ReadOnlyDatabaseConnection < ActiveRecord::Base
self.abstract_class = true
end
并添加了mixin switch_connection.rb
module SwitchConnection
def readonly_db_connection
current_conf = ReadOnlyDatabaseConnection.connection_config
begin
ReadOnlyDatabaseConnection.establish_connection(READONLY_CONFIG).tap do
puts "Primary DB -> Follower DB"
end
yield
ensure
ReadOnlyDatabaseConnection.establish_connection(current_conf).tap do
puts "Follower DB -> Primary DB"
end
end
end
end
然后在application_controller.rb
,我做了 -
include SwitchConnection
around_filter :readonly_db_connection, only: [:index, :show]
这是正确的方法吗?是否有更好或更安全的方法将所有show
和index
流量重定向到只读数据库?
答案 0 :(得分:3)
我认为继承自ActiveRecord::Base
的对象应该负责处理数据库。您可以使用模型来检查只读从数据库。
class ReadOnlyModel < ActiveRecord::Base
establish_connection 'readonly_db'
def readonly?
true
end
end
class Controller
def index
@models = ReadOnlyModel.all
end
end
# in config/database.yml
readonly_database:
adapter: #...
如果你想使用相同的表名(我怀疑你这样做),你可以使用table_name方法。
class Model < ActiveRecord::Base
end
class ReadOnlyModel < ActiveRecord::Base
self.table_name :models
end
这里是readonly?
方法的documentation。