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

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

谢谢!

What does database connection limit mean?

【问题讨论】:

    标签: postgresql heroku connection limit


    【解决方案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
      

      输出将类似于

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

      1. heroku/python
      2. 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

      【讨论】:

        猜你喜欢
        • 2019-02-16
        • 2018-08-18
        • 2013-12-05
        • 2016-04-27
        • 2012-08-03
        • 2020-03-03
        • 2018-05-19
        • 2018-07-13
        • 2018-01-24
        相关资源
        最近更新 更多