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 应用程序连接起来