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

时间:2017-09-29 19:04:13

标签: ruby-on-rails multithreading postgresql openshift puma

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

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

我目前的理论是:

5 pods x 1 container x 16 threads x 10 connection pool = 800 possible PostgreSQL connections

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

5 pods x 1 container x 10 connection pool = 50 possible PostgreSQL connections

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

有人能指出我关于这个问题的最终文件吗?谢谢!

1 个答案:

答案 0 :(得分:1)

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

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