Heroku Postgres 连接限制?

Posted

技术标签:

【中文标题】Heroku Postgres 连接限制?【英文标题】:Heroku Postgres Connection Limit? 【发布时间】:2020-03-19 10:37:00 【问题描述】:

我正在构建一个附加到 Heroku Postgres 数据库的网站,并且正在使用免费的爱好开发计划。根据 Heroku,这意味着“最多 20 个连接”。这是否意味着最多可以有 20 人使用该网站,而后端的数据库正在收集数据?知道如果连接超过该级别会发生什么吗?付费计划的最大连接限制为 500,但如果人们在企业级别使用它,那么在我看来,这似乎也很低。任何颜色都将不胜感激。对此有一个先前的问题,但答案对我来说不是很清楚。

谢谢!

What does database connection limit mean?

【问题讨论】:

【参考方案1】:

根据您使用的网络框架,这可能会有所不同,但是:

通常每个服务器进程最多有一个数据库连接。这可能是每个正在运行的 web- 或 worker-dyno 的一个。如果您的框架在每个测功机上运行多个线程/工作进程(大多数都这样),或者更多。

只有在对您的应用程序有实际请求时才使用这些连接,而不是在用户只是查看页面时使用。

当您运行异步框架(例如 node.js 或 python 中的 greenlets)时,这会稍微复杂一些。

简单的方法:只需测试它。您将在 heroku 界面中看到当前连接数。有一些框架和服务可以让您测试并发用户。

更简单的方法(因为它是在爱好计划上运行的,所以它看起来像是一个爱好应用程序):看看它什么时候坏了:)。

【讨论】:

【参考方案2】:

PostgreSQL 可以配置为限制同时连接到数据库的数量。 Heroku 附带有连接限制的计划。 “爱好”计划有 20 个连接,而标准计划从 120 个连接开始。当我们开始开发和测试,尤其是自动化测试时,爱好计划会引发错误 PG::Error (FATAL: too many connections for role "xxxxxxx")。如果我们检查与 Heroku CLI 的连接,我们会得到

Heroku CLI

直接的解决方案是使用命令终止所有连接:

$ heroku pg:killall --app <app name>

这不是一个永久的解决方案。我们对这个网站也有同样的问题。我们尝试了互联网上提供的许多解决方案,尤其是在堆栈溢出方面。

知道如何计算所需的连接数非常重要。 Heroku 文档说...

假设您没有在应用程序代码中手动创建线程,您可以使用您的网络服务器设置来指导您需要的连接数。 Unicorn Web 服务器使用多个进程进行横向扩展,如果您没有在应用程序中打开任何新线程,每个进程将占用 1 个连接。因此,在您的独角兽配置文件​​中,如果您将 worker_processes 设置为 3,如下所示:

worker_processes 3 然后,您的应用将为工作人员使用 3 个连接。这意味着每个测功机将需要 3 个连接。如果您使用的是“开发”计划,则可以横向扩展至 6 个 dyno,这意味着最多 20 个活动数据库连接中的 18 个。但是,连接可能会进入错误或未知状态。

解决方案 - 限制与 PgBouncer 的连接

最简单的解决方法是限制与 PG 保镖的连接。对于许多框架,您必须禁用准备好的语句才能使用 PgBouncer。然后将 PgBouncer buildpack 添加到您的应用中。

$ heroku buildpacks:add https://github.com/heroku/heroku-buildpack-pgbouncer

输出将类似于

添加了构建包。下一个版本将使用:

    heroku/python https://github.com/heroku/heroku-buildpack-pgbouncer 运行 git push heroku master 以使用这些构建包创建新版本。 现在你必须修改你的 Procfile 来启动 PgBouncer。在您的 Procfile 中,将命令 bin/start-pgbouncer-stunnel 添加到 Web 条目的开头。所以如果你的 Procfile 是

web: gunicorn .wsgi:application --worker-class gevent 将其更改为:

web: bin/start-pgbouncer-stunnel gunicorn .wsgi:application --worker-class gevent 将结果提交到 git,在暂存应用上进行测试,然后部署到生产环境。

在部署时,您会看到

OUTPUT

【讨论】:

以上是关于Heroku Postgres 连接限制?的主要内容,如果未能解决你的问题,请参考以下文章

Heroku/Postgres:引起:java.net.ConnectException:连接被拒绝(连接被拒绝)

将 Postgres Heroku 与 Knex 连接不起作用

Knex 与 Heroku Postgres 连接出现错误?

无法将 AWS-Postgres 服务器与带有 heroku 托管的 Spring Boot 应用程序连接起来

Nodejs 应用程序的 Heroku Postgres 附加连接字符串

playframework-1.x heroku postgres