我正在使用 Rails 6.1 的水平分片功能,效果很好。
我正在使用将子域路由到正确分片的概念,因此我的 multi_db.rb 配置如下所示:
Rails.application.configure do
config.active_record.shard_selector = { lock: true }
config.active_record.shard_resolver = ->(request) {
# I only have 2 shards, primary (english) and one in spanish:
return request.subdomain == "es" ? "spanish": "primary"
}
end
如果我点击某些 URL,例如:
es.mycompany.com
,代码将正确路由到“西班牙”分片。如果我点击 mycompany.com
,它就会进入主要页面。
但是现在我有一个工作想要在特定的分片中运行。据我所知,当作业运行时,上面的代码不会被调用,并且考虑到“请求”参数,这是有意义的;看起来它只是根据某个控制器的请求调用的。
但是对于作业,不涉及控制器,那么如何“挂钩”作业的分片选择呢?
事实证明这相当简单:
def perform(shard)
ActiveRecord::Base.connected_to(shard: shard) do
# Job code
end
end
这假设您在开始工作时知道分片(这是我的情况)。