【问题标题】:Rails multi-tenancy, scopes, class variables and thread safetyRails 多租户、范围、类变量和线程安全
【发布时间】:2011-10-25 19:43:40
【问题描述】:

短版

类变量在控制器操作期间是线程安全的吗?

加长版

我正在编写一个 Rails 3 应用程序,该应用程序使用单个数据库模式实现多租户,每个表中都有 tenant_id 列,以识别数据属于谁。

当然,我需要一种方法来确定在数据库上运行的所有查询的范围,以确保每个租户对数据的访问都是正确的。

一些人建议通过始终通过tenant 实例访问数据库来实现此目的,例如:

current_tenant.associate_collection.where(...)

等等

但是,由于多租户是一个架构问题(而不是业务领域问题),我希望通过在全局范围内设置它来尽可能保持模型对模型透明。它也很干燥。

我发现我可以使用 multitenant gem 和 around_filters 做到这一点:

class ApplicationController
  around_filter do
    Multitenant.with_tenant current_tenant
      yield
    end
  end
end

这会操纵适当模型的default_scope,以便所有数据访问都自动限定在当前租户范围内。

这在开发中效果很好,但我担心线程安全。 Multitenant.with_tenantcurrent_tenant 引用保留在类变量中。

问题是当控制器操作在堆栈上时,我可以依赖该变量的完整性吗?或者它是否会被另一个请求破坏?

另外,关于 Rails 中的一般并发问题,有什么好的资料来源?

【问题讨论】:

    标签: ruby-on-rails-3 concurrency thread-safety multi-tenant scopes


    【解决方案1】:

    这不是持续时间的问题,并且控制器没有什么特别之处可以使其成为原子(不间断)代码序列。线程安全是关于了解锁、同步和线程调度程序。

    在这种情况下,我认为您的问题甚至不是特定于 Rails 的。一般来说,线程安全是通过在写入发生时锁定数据并在写入完成时解锁数据来实现的。如果您熟悉的话,它与数据库锁定机制非常相似。

    如果有关于 Ruby 的良好参考资料,我会去这里:http://www.rubycentral.com/pickaxe/tut_threads.html

    有关线程安全概念的更多信息(毕竟,线程在操作系统级别运行,因此更多的是了解线程安全如何在任何程序中工作),我会去这里:http://en.wikipedia.org/wiki/Thread_safety

    【讨论】:

    • 感谢 normalocity,感谢 ~ 但问题 确实特定于 Rails。我在问有问题的类变量是否在控制器操作运行时同步。无论如何,我猜你可以自己创建锁,但了解 Rails 默认如何处理这将很有用。
    • 也许我有点太宽泛了,我同意。控制器不会自动同步。你必须自己把它锁起来。
    猜你喜欢
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 2013-05-26
    • 2015-07-07
    • 1970-01-01
    • 2018-01-13
    相关资源
    最近更新 更多