Puma 线程如何与 Postgres 连接池交互?



我有一个在OSE上运行的Rails应用程序,5个pod,每个pod有1个容器。Rails 应用程序使用具有默认线程设置(最小值:0,最大值:16)的 Puma Web 服务器。在我的 database.yml 中,我定义了 10pool:的连接。

我想知道我的最大 PG 连接占用空间是多少?

我目前的理论是:

5 podsx1 containerx16 threadsx10 connection pool=800 possible PostgreSQL connections.

但是,我质疑 16 个 Puma 线程中的每一个是否共享来自同一个 PG 连接池?在这种情况下,公式将是:

5 podsx1 containerx10 connection pool=50 possible PostgreSQL connections.

(当然,如果这个数学是正确的,拥有 Puma 16 线程将是一个问题,因为我的应用程序可能会请求比可以提供的连接更多的连接,每个线程 1 个,比池提供的多 6 个。

谁能指出我关于这个主题的权威文档?谢谢!

如果连接池在进程内并跨线程分配数据库连接,如果所有数据库连接都繁忙,线程正在等待,则第二个是正确的。如果没有,则为第一个。无论哪种方式,它实际上都可能更糟。如果您使用的是滚动部署,则在重新启动时,可能会有一个额外的 Pod 处于活动状态。

看看在PostgreSQL数据库实例前面使用pgbouncer(https://pgbouncer.github.io/)。我的理解是,它提供了额外的灵活性,能够管理数据库连接池,而无需在应用程序中执行任何操作,而是在 pgbouncer 中处理。

相关内容

最新更新