Rails multi_db分片中间件在生产环境未运行,求排查原因
问题:多数据库分片配置在生产环境无执行痕迹
我的multi_db.rb配置如下:
Rails.application.configure do config.active_record.shard_selector = { lock: true } config.active_record.shard_resolver = ->(request) { puts "MULTI_DB: subdomain = #{request.subdomain}" return request.subdomain == "fr" ? "french": "default" } end
该配置旨在根据语言子域名路由到不同数据库分片,本地环境运行正常,每次请求都会输出上述puts调试信息,但生产环境完全看不到该代码运行的痕迹,请问可能遗漏了什么配置或步骤?
可能的原因及解决办法
- 配置未在生产环境加载:Rails生产环境默认仅加载
config/environments/production.rb和config/initializers/下的文件。如果multi_db.rb放在其他目录,生产环境不会自动加载。解决办法:要么将文件移至config/initializers/目录,要么在config/environments/production.rb中添加require_relative '../multi_db'手动加载。 - 日志输出未正确配置:生产环境中
puts的内容不会输出到控制台,而是可能被丢弃或写入了未查看的位置。替换puts为Rails标准日志方法:Rails.logger.debug("MULTI_DB: subdomain = #{request.subdomain}"),同时在config/environments/production.rb中临时设置config.log_level = :debug(排查完成后改回:info避免日志冗余),然后查看log/production.log文件。 - 未触发数据库查询:Rails的分片选择器仅在执行ActiveRecord数据库查询时才会触发。如果请求未涉及任何数据库操作(比如纯静态页面、无数据库交互的API),这段代码不会执行。可以在测试请求中加入一个简单的数据库查询(比如
User.first)验证是否触发。 - 子域名未正确传递:生产环境的反向代理(如Nginx)可能未将真实子域名传递给Rails。检查代理配置,确保添加了
proxy_set_header Host $host;,否则request.subdomain会为空,代码执行了但输出内容不符合预期。 - 分片锁定的潜在影响:
lock: true会在请求周期内锁定分片,如果请求中有其他代码提前设置了分片,可能导致当前解析逻辑不执行。可以临时将lock: false测试,确认是否是锁定机制导致的问题。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

