ruby - 暂时将 MongoMapper 切换为从从属副本读取

标签 ruby mongomapper

我正在将 MongoMapper 用于我们的主数据存储,我想针对我们副本集中的从节点而不是主节点运行报告作业。不幸的是,我们的大部分后台作业都是读/写的,需要与主作业相对应。

有什么方法可以做如下的事情:

MongoMapper.options({:slave_ok => true})

report.fetch_data  # does all sorts of stuff, uses normal Models, developer doesn't have to go out of his/her way to specify a read preference

MongoMapper.options({:slave_ok => force})

现在看起来 MongoMapper 真的只是希望您在建立连接时设置读取首选项,然后不要更改它。

最佳答案

MM 本身并不支持这一点,但通过插件在每个模型的基础上做到这一点并不难。

module MongoMapper
  module Plugins
    module ReadPreference
      extend ActiveSupport::Concern

      included do
        class << self
          attr_accessor :read_preference
        end
      end

      module ClassMethods
        def query(options={})
          options.merge!(:read => read_preference) if read_preference
          super options
        end

        def with_read_preference(preference)
          self.read_preference = preference
          begin
            yield
          ensure
            self.read_preference = nil
          end
        end
      end
    end
  end
end

MongoMapper::Document.plugin(MongoMapper::Plugins::ReadPreference)

并用我的 master-only 集群测试它:

2.0.0p0 :002 > User.first
 => <User:0x30a1948 _id: 4cddf1ff98db746691000002, display_name: (Deleted account)>
2.0.0p0 :003 > User.with_read_preference(:secondary) { User.first }
Mongo::ConnectionFailure: No replica set member available for query with read preference matching mode secondary and tags matching [].

有效!

如果你想对连接进行全局设置,你可以使用模块属性扩展 MongoMapper 模块,并修改插件以首先查找它。

关于ruby - 暂时将 MongoMapper 切换为从从属副本读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17774584/

相关文章:

ruby-on-rails - Ruby on Rails - 主键和外键

ruby - Rspec : expect vs expect with block - what's the difference?

ruby - 使用 MongoMapper 根据数组的大小在 MongoDB 中排序项目?

ruby - 使用 mongomapper 时使用 "or"语句

ruby - 连字符键名称上的 MongoMapper 语法错误

ruby - {葡萄}授权

ruby - 将变量传递给 Middleman 2 中的模板

ruby-on-rails - RoR 的 "magic"命名空间解析是如何工作的?

mongodb - 通过 mongos Router 在多个服务器中拆分 MongoDB 集合

php - mongodb remove 不返回 bool 值