分片选择中间件¶ ↑
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,但如果应用程序有多个数据库,则应将此选项设置为分片数据库的抽象连接类的名称。
方法
Attributes
| [R] | options | |
| [R] | resolver |
类公共方法
new(app, resolver, options = {}) 链接
来源: 显示 | 在 GitHub 上
# File activerecord/lib/active_record/middleware/shard_selector.rb, line 47 def initialize(app, resolver, options = {}) @app = app @resolver = resolver @options = options end
实例公共方法
call(env) 链接
来源: 显示 | 在 GitHub 上
# 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