如何在heroku上的一个rails应用程序访问许多数据库

时间:2013-06-14 00:58:59

标签: ruby-on-rails postgresql heroku

我希望能够让一个应用程序访问HEROKU“系统”上的多个数据库。 是否可以动态更改与数据库的连接?

为什么我要问......

我有一个应用程序,有很多处理器繁重的后台工作。如果给定用户上传的产品Feed数量为50,000,必须与现有产品进行比较并仅更新增量,则可能需要“几分钟”。

现在为了减轻延迟,我将多个工作人员分开,每个工人都从中抽出一小撮,直到没有。在GUI开始变得迟钝之前,我可以找到大约20名工人,因为DB正在受到重创 我调整了一些代码并在一定程度上索引了DB,我确信我能做的更多,但它最终会受到收益递减规律的影响。

对于一个用户,我不太在意......如果你上传50k产品,你需要等一下......

但用户选择上传会影响用户2。 (不同公司所以没有交叉数据)..

目前,我通过在postgresql中将模式与模式分开来处理不同的用户。 然而,不同的用户共享相同的数据库连接,即使在最佳计划中,我也可以看到20个用户同时尝试上传50,000个产品的时间。(例如,第一个月/季度)。 由于这个原因,用户21会看到他们的系统发生了巨大的减速..

所以问题:我可以将不同的用户分配到不同的数据库吗?用户登录,根据中央数据库验证其信息,然后另一个数据库接管?

我目前的解决方案是heroku的不同实例。维护代码很容易,因为它是一个基础,我只是编写git push(es)的脚本。唯一的问题是不同的登录URL;如果我找不到一个简单的数据库交换机解决方案,我想我可以面对。

2 个答案:

答案 0 :(得分:1)

听起来您可以按用户或用户集对数据进行分片,因为您已经按模式将它们分开了。如果是这种情况,并且您正在使用Ruby和ActiveRecord,请查看https://github.com/tchandy/octopus。我想你不是想动态启动数据库,而是你已经构建好并准备好使用它们,并且可以随时添加更多数据库。

当然,通过使用正确的工具进行类型的密集处理(例如Heroku Hadoop附加组件之一),听起来你正在做的事情可以更有效地完成。尽管如此,如果出于任何原因这不是一个选项,请查看上面的宝石。还有其他一些类似的宝石,当然你可以在没有这个宝石的情况下从技术上管理你自己的ActiveRecord连接,但我认为你会发现这很快就会很痛苦。

当然,如果您不使用Ruby或ActiveRecord,仍然会对数据进行分片,并在应用程序的语言中查找上面的gem:)。

答案 1 :(得分:0)

heroku上的postgres数据库配置了环境变量。当你运行heroku config时,你会看到:

DATABASE_URL:   postgres://xxx.compute.amazonaws.com:5432/xxx

您可以使用这些变量连接到其他heroku实例上的数据库,或者在不同的heroku应用程序上共享一个数据库。

如果你尝试在免费的heroku实例上运行这种东西,我认为这违反了他们的服务条款。

如果它是关于可扩展性的,我认为你只需支付更昂贵的数据库实例......