класс ActiveRecord::Middleware::ShardSelector
Промежуточное ПО для выбора шарда
ShardSelector Middleware предоставляет инфраструктуру для автоматического переключения между шардами. Rails предоставляет базовую инфраструктуру для определения шарда, на который нужно переключиться, и позволяет приложениям при необходимости реализовывать собственные стратегии переключения.
Настройка
Приложения должны предоставить резолвер, содержащий специфичную для приложения логику выбора подходящего шарда. Установка config.active_record.shard_resolver приведёт к тому, что Rails добавит ShardSelector в стек промежуточного ПО по умолчанию.
Резолвер и любые параметры конфигурации можно задать в конфигурации приложения с помощью инициализатора, например:
Rails.application.configure do
config.active_record.shard_selector = { lock: false, class_name: "AnimalsRecord" }
config.active_record.shard_resolver = ->(request) {
subdomain = request.subdomain
tenant = Tenant.find_by_subdomain!(subdomain)
tenant.shard
}
end
Конфигурация
Поведение ShardSelector можно изменить с помощью ряда параметров конфигурации.
lock:-
lockпо умолчанию имеет значение true и запрещает запросу переключать шарды внутри блока. Еслиlockимеет значение false, переключение шардов будет разрешено. При шардинге на основе арендаторовlockвсегда должен иметь значение true, чтобы предотвратить случайное переключение кода приложения между арендаторами. class_name:-
class_name— это имя абстрактного класса подключения, который требуется переключить. По умолчаниюShardSelectorбудет использоватьActiveRecord::Base, но если приложение использует несколько баз данных, для этого параметра следует задать имя абстрактного класса подключения к базе данных с шардингом.
Атрибуты
Публичные методы класса
# File activerecord/lib/active_record/middleware/shard_selector.rb, line 47
def initialize(app, resolver, options = {})
@app = app
@resolver = resolver
@options = options
end Публичные методы экземпляра
# File activerecord/lib/active_record/middleware/shard_selector.rb, line 55
def call(env)
request = ActionDispatch::Request.new(env)
shard = selected_shard(request)
set_shard(shard) do
@app.call(env)
end
end
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.