我有一个运行在OSE上的Rails应用程序,5个pod,每个pod一个容器。Rails应用程序使用Puma web服务器进行默认线程设置(最小值:0,最大值:16)。在我的database.yml中,我定义了10的连接pool:
我想知道我最大的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/)。我的理解是,它在管理数据库连接池时提供了额外的灵活性,而不需要在应用程序中做任何事情,相反,它在PGBONCER中进行处理。

关于ruby-on-rails - Puma线程如何与Postgres连接池进行交互?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46495425/

10-12 20:33
查看更多