跳至内容 跳至搜索

分片选择中间件

ShardSelector Middleware 提供了一个自动切换分片的框架。Rails 提供了一个基本框架来确定切换到哪个分片,并允许应用程序在需要时编写自定义的切换策略。

设置

应用程序必须提供一个解析器,该解析器将提供特定于应用程序的逻辑来选择合适的分片。设置 config.active_record.shard_resolver 会导致 RailsShardSelector 添加到默认中间件堆栈中。

解析器以及任何配置选项都可以在应用程序配置中使用一个初始化器进行设置,如下所示:

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,但如果应用程序有多个数据库,则应将此选项设置为分片数据库的抽象连接类的名称。

方法
C
N

Attributes

[R] options
[R] resolver

类公共方法

new(app, resolver, options = {})

# 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)

# 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