gpt4 book ai didi

mysql - Rails Multi-Tenancy 架构,限定对多个租户的访问

转载 作者:行者123 更新时间:2023-11-29 03:04:55 25 4
gpt4 key购买 nike

我们目前采用单租户数据库架构,MySQL 运行超过 100 个数据库。我们使用 Apartment gem 在子域上切换数据库连接,一切都很好!

但是,我们现在需要创建所谓的“Umbrella”客户端,它可以访问一组现有客户端的所有数据。我不认为这对于我们的单租户数据库架构来说是立即可行的(我调查了一下,查询多个 MySQL 数据库似乎很糟糕),所以我开始研究 Postgres 模式的不同实现。

我正在寻找一些建议:

  • 是否可以在 Postgres 中查询多个模式并以某种方式整理结果(寻找 Rails 实现)?我可以预见主键冲突的问题吗?

  • 有一个新的模式会更好吗?表示/复制需要的模式组中的所有数据被访问?它需要是实时的。

  • 如果是这样,可以在我当前的多数据库中实现类似的东西吗使用 MySQL 设置? (尽量减少痛苦)

我对使用数据库字段在 MySQL 中实现 Multi-Tenancy 持谨慎态度,因为数据安全/隐私对该产品来说是一件大事,而且开发人员犯错误的可能性很大。

最佳答案

尽管在我第一次着手使用 Rails 应用程序时发现了许多 Multi-Tenancy 示例,但我也找不到一个让我感到完全舒服的示例。但我终于有了一个令我满意的解决方案。

我从“范围 Multi-Tenancy ”railscast 开始

http://railscasts.com/episodes/388-multitenancy-with-scopes

然后使用本指南研究如何使用设计子域进行 Multi-Tenancy 工作:

https://github.com/plataformatec/devise/wiki/How-To:--Isolate-users-to-log-into-a-single-subdomain

但我并没有从表面上接受它;我一头扎进去,真正理解设计是如何工作的。

一旦我准备好所有这些,我就可以使用 Multi-Tenancy gem:

https://github.com/wireframe/multitenant

但我并没有就此止步。 Multi-Tenancy gem 要求您在需要适当范围内时使用 Multitenant.with_tenant,因此我创建了一个如下所示的 TenantController:

  around_filter :scope_current_tenant

def scope_current_tenant
begin
Firm.current = Firm.find_by_subdomain!(request.subdomain)
rescue
raise ActionController::RoutingError.new('Not Found')
end

Multitenant.with_tenant Firm.current do
yield
end

ensure
Firm.current = nil
end
end

然后我希望租户范围内的任何 Controller 都继承自 TenantController 而不是 ApplicationController。这样我就不必记住 Controller 的任何细节,它“正常工作”。开发人员唯一需要考虑的是“这是一个处理租户数据的 Controller 吗?”

虽然这仍然取决于开发人员正确地做一些事情(从正确的 Controller 继承,在模型中说“acts_as_multitenant”,但它在实践中确实运作良好。

关于mysql - Rails Multi-Tenancy 架构,限定对多个租户的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17279141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com