【问题标题】:How to close SQL connections of old Cloud Run revisions?如何关闭旧 Cloud Run 修订版的 SQL 连接?
【发布时间】:2020-02-07 15:56:42
【问题描述】:

上下文

我在 Cloud Run 上运行 SpringBoot 应用程序,该应用程序使用 Hikari 连接池连接到 postgres11 CloudSQL 数据库。我正在使用最小的 PSQL 实例(1vcpu/614mb/25connection 限制)。对于设置,我遵循了以下资源:

Connecting to Cloud SQL from Cloud Run

Managing database connections

问题

部署第三个修订版后,我收到以下错误:

FATAL: remaining connection slots are reserved for non-replication superuser connections

我发现了什么

  • 默认连接池大小为 10,因此它在第三次部署时失败 (30 > 25)。

  • 删除旧版本时,Cloud SQL 管理面板中显示的活动连接数减少 10,下一次部署成功。

问题

看来,旧的 Cloud Run 修订版被保持在“冷”状态,维护它们的连接池。有没有办法在不删除修订的情况下关闭这些连接?

best practices 部分它说:

...我们建议您使用支持自动重新连接断开的客户端连接的连接池的客户端库。”

在 Cloud Run 中管理连接池的推荐方法是什么,因为旧版本似乎设法以某种方式维持它们的连接?

谢谢!

【问题讨论】:

  • 您是如何在代码中处理这些连接的?如果它们不被使用或它们始终处于活动状态,你会正确关闭它们吗?
  • 您好,连接池由 Hikari (github.com/brettwooldridge/HikariCP) 管理。目前,除了在启动时运行的迁移(flyway)之外,我没有从代码访问数据库。 AFAIK Hikari 尝试维护配置的连接数(默认 = 10),即使应用程序未使用它们。因此,为了回答您的问题,我假设他们仍然活跃。
  • Cloud Run 不会做任何事情来通知您的应用程序,因此,软件关闭挂钩将不起作用。对于云运行,打开连接和关闭连接。不要期望连接池等按预期工作。恕我直言,文档不应该推荐 Cloud Run 的连接池,除非是长时间运行的应用程序,即使这样,您也应该能够编写遵循打开然后关闭原则的代码。

标签: postgresql google-cloud-platform google-cloud-sql hikaricp google-cloud-run


【解决方案1】:

目前,Cloud Run 不提供任何关于它在启动后会保持温暖多长时间的保证。不使用时,实例会因不一定关闭而受到严重限制。因此,即使没有定向流量,您的一些修订也会阻止连接。

即使在这种情况下,我也不同意您应该避免使用连接池的想法。连接池可以降低延迟,提高稳定性,并有助于限制打开连接的数量。或者,您可以使用以下一些配置选项来帮助检查您的池:

minimumIdle - 此属性控制 HikariCP 尝试在池中维护的最小空闲连接数。如果空闲连接数低于此值并且池中的总连接数小于 maximumPoolSize,HikariCP 将尽最大努力快速有效地添加额外的连接数。

maximumPoolSize - 此属性控制池允许达到的最大大小,包括空闲和使用中的连接。

idleTimeout - 此属性控制允许连接在池中空闲的最长时间。此设置仅在 minimumIdle 定义为小于 maximumPoolSize 时适用。一旦池达到 minimumIdle 连接数,空闲连接将不会被淘汰。

如果您将minimumIdle 设置为0,您的应用程序仍然可以同时使用最多maximumPoolSize 连接。但是,一旦池中的连接空闲idleTimeout 秒,它将被关闭。如果您将idleTimeout 设置为 1 分钟之类的小值,它将允许您的池使用的连接数在不使用时缩减为 0。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    这里的问题是当连接打开时,HikariCP 不会关闭连接。我对 Hikari 了解不多,但我找到了 this,它解释了如何通过 Hikari 处理连接。希望对您有所帮助!

    【讨论】:

    • 您好,感谢您的回答。 Hikari+Spring 会在应用程序关闭时自动关闭连接:github.com/brettwooldridge/HikariCP/issues/210 我相信您所链接问题的答案不适用,因为现阶段我没有处理代码中的任何连接。您是否认为在部署新修订版时应用程序没有正确关闭 - 因此连接没有清理干净?我
    • hmmm 在您共享的链接中,它提到使用 shutdown() 或 close() 是必不可少的,并且 Spring 有调用 destroy 方法的方法(我认为您应该以某种方式调用好)
    • 让我知道我的理论是否正确,以便我可以了解有关产品的更多信息 :)
    • 我最终遵循了 kurtisvg 的建议,并通过调整配置解决了这个问题,因此我没有发现有关如何以编程方式处理此问题的新信息。无论如何,感谢您的意见:)
    猜你喜欢
    • 2023-02-09
    • 2019-10-28
    • 2020-06-15
    • 2021-04-17
    • 2019-09-05
    • 1970-01-01
    • 2020-08-31
    • 2020-07-01
    • 1970-01-01
    相关资源
    最近更新 更多