1

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

为什么我问...

我有一个应用程序,它有很多非常繁重的后台作业。如果给定的用户上传了一个产品 Feed,比如说 50,000 种产品,这些产品必须与现有产品进行比较,并且只更新增量,这可能需要“几分钟”的时间。

现在,为了减轻延迟,我启动了多个工人,每个工人都从地段中小口咬一口,直到没有人为止。在 GUI 开始感到迟钝之前,我可以找到大约 20 个工人,因为 DB 正在受到重创。
我已经调整了一些代码并在一定程度上对数据库进行了索引,我确信我可以做更多的事情,但它最终会受到收益递减规律的影响。

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

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

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

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

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

4

2 回答 2

1

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

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

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

于 2013-06-14T03:32:45.947 回答
0

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

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

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

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

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

于 2013-06-14T01:24:28.397 回答