我正在研究Rails中的多租户应用程序。因为每个请求多次访问租户的数据(通过ApplicationInstance模型访问),所以我决定在一个单例中使用如下所示的方法在请求期间缓存它:
def application_instance
@current_application_instance ||= ApplicationInstance.find_by :subdomain => subdomain
raise TenantError unless @current_application_instance
puts "Current Tenant: #{@current_application_instance.subdomain}"
@current_application_instance
end
然后在几个模型的范围内使用它:
default_scope -> { where(:application_instance_id => application_instance.id) }
如果我在一个租户(test.myapp.dev)上向系统发出请求,它会正确地将“Current Tenant:test”放入控制台。但是,如果我向(admin.myapp.dev)发出请求,它仍然会向控制台输出“Current Tenant:test”。不知何故,这个单身人士的状态在请求之间持续存在。
几个问题:
1)如何防止单身人士的状态在请求之间保持不变?
2)这是一场等待在多线程环境中发生的灾难吗?
更新
我现在的解决方法是在每个请求的开头设置@current_application_instance
并在线程安全模式下运行rails。这种方式@current_application_instance
在请求开始时是正确的,并且在请求过程中不会更改(线程安全模式)。这是一个可行的解决方法吗?在线程安全模式下运行会损害可伸缩性吗?