【问题标题】:How can I have multiple schemas and multiple subdomains when hosting on Heroku?在 Heroku 上托管时如何拥有多个架构和多个子域?
【发布时间】:2014-07-12 22:39:48
【问题描述】:

我计划在我即将推出的应用程序中使用 Devise 和 Apartment 为每个创建帐户的组织创建子域。我想在 Heroku 上托管我的应用程序,但遇到了以下引用:

在数据库中使用多个模式的最常见用例是 构建一个软件即服务应用程序,其中每个客户都有 他们自己的架构。虽然这种技术看起来很有说服力,但我们强烈 推荐反对它,因为它已经导致了无数的操作案例 问题。例如,即使是中等数量的模式(> 50)也可以 严重影响 Heroku 数据库快照工具的性能, PG 备份。

什么技术可以很好地与 Heroku 一起在 Rails 4 中托管 basecamp 样式的子域,许多用户可以登录到他们所属的子域?

如果 Heroku 不起作用,还有哪些其他 PaaS 选项可以很好地做到这一点?

【问题讨论】:

标签: ruby-on-rails heroku devise apartment-gem


【解决方案1】:

域

首先,您需要确保为子域使用自己的自定义域。

Heroku 的标准 xxx.herokuapp.com 将无法在此之上处理另一个子域 - 所以您基本上需要从一开始就使用您的自定义域

如需更多信息,请联系reference this documentation!


Multi Tenancy

虽然我没有使用 PGSQL 的 schemas 的经验,但我确实有一些整体上的多租户。

这里有很多很棒的资源:

本质上,multi-tenancy 只是一种范围数据的方式,以便它仅您看到/与之交互的租户。在数据库的意义上,实现这一点的两种方法是使用不同的数据库(就像使用 MYSQL 一样),或者使用模式(比如使用 PGSQL)

虽然我无法直接解决您的问题,但我可以为您提供一些想法:


模型

实现多租户的一种方法,尤其是使用 MYSQL 之类的,是通过模型来实现的:

How do i work with two different databases in rails with active records?

#lib/admin.rb
class Admin < ActiveRecord::Base
  self.abstract_class = true 
  establish_connection "#{Rails.env}_admin"
end

#app/models/option.rb
Class Option < Admin
  # do stuff
end

这对我们来说非常有效,尽管我们还没有让它适用于范围帐户。我们一直在考虑为Account 设置一个@@class_variable 或其他东西,但目前还没有进行。

这对于 MYSQL 驱动的数据库非常有效,但也意味着您必须为每个帐户创建数据库,这不适用于 PGSQL(据我所知)


PGSQL 模式

我觉得这是一种欺骗方式,因为所有数据仍存储在 1 个数据库中 - 它基本上只是范围围绕不同类型的数据。

这里的问题是,真正的多租户应该是您完全分离用户数据的地方,因此如果他们愿意,您可以将其完全从应用程序中删除。从安全和访问的角度来看,它是最灵活和模块化的方式。

Heroku 的问题是他们只能使用一个数据库(他们让每个人都可以访问他们的 AWS 数据库实例),这意味着他们不能允许您创建 50 多个免费数据库(它不会很好地工作)。

当然,您可以使用自己的堆栈来创建所需的数据库,但就 PGSQL 而言,它只是为您的数据创建 schemas,然后使用类似 -Apartment 的东西来实现它:

PostgreSQL 在以下情况下的工作方式与其他数据库略有不同 创建新租户。如果你使用的是 PostgreSQL,Apartment by 默认将设置一个新架构并迁移到那里。这提供了 更好的性能,并允许 Apartment 在系统上工作,例如 Heroku,不允许创建全新的数据库。

【讨论】:

  • 感谢里奇!我很欣赏这种彻底性。创建超过 50 个模式会是一个大问题吗?您知道 PG 备份是否有任何替代方案?
  • 我不确定是否诚实。我在 Heroku 上使用 PGSQL 的次数不多——只是涉足了它。如果您获得正确的响应至关重要,Heroku 确实会提供高级支持:heroku.com/critical
  • 在这种情况下,什么是 Heroku 的好替代品?
  • Rich,你能帮我实现多租户吗?我非常接近这一点,例如当我手动输入 url 并创建记录时,它会在该特定租户中创建记录。但是我可以动态实现吗?
  • 你使用的是PGSQL还是MYSQL?
猜你喜欢
  • 2016-11-21
  • 2014-04-19
  • 2019-09-05
  • 1970-01-01
  • 2014-01-31
  • 2019-12-01
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多