【发布时间】:2020-11-01 09:22:32
【问题描述】:
我可以完全禁用 Ruby on Rails 连接池吗?
考虑到 PgBouncer 已经处理数据库连接池,这可以吗?
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-5 pgbouncer
我可以完全禁用 Ruby on Rails 连接池吗?
考虑到 PgBouncer 已经处理数据库连接池,这可以吗?
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-5 pgbouncer
没有。
PgBouncer 将自己作为 Postgres 服务器向客户端宣传,然后管理与实际 Postgres 服务器的连接。除了 PgBouncer 之外,我们无需深入了解任何细节——从 Rails 的角度来看,PgBouncer 实例是 Postgres 服务器,所以让我们解释一下为什么从那里开始。
在 Rails 中,并发性需要考虑两个主要因素:可以向其 Web 服务器发出的入站客户端请求的数量以及数据库连接池的大小。
如果您的连接池大小为 1,那么您的应用程序实际上是单线程的:每次发出必须进行数据库查询的入站客户端请求时,该请求都必须从池中检查到数据库的连接。当池大小为 1 且并发入站请求数大于 1 时,第一个请求之后的每个请求都必须暂停,而第一个请求完成其查询并将连接返回到池。如果第一个请求需要很长时间才能完成,那么后续请求可能会在等待池中的可用连接时超时。
所以在 Rails 方面,您希望有一个大小大于 1 的连接池以允许并发。如果您将其设置为 1 的大小,那么您如何配置 PgBouncer 就无关紧要了; Rails 将始终与数据库建立最多一个连接,并且所有线程必须共享该单个连接。
您可以在ActiveRecord::ConnectionAdapters::ConnectionPool < Object 阅读有关 Rails 中连接池的更多信息。
【讨论】: