【问题标题】:Can I / Should I disable Ruby On Rails Database Connection Pooling when using PgBouncer?使用 PgBouncer 时,我可以/应该禁用 Ruby On Rails 数据库连接池吗?
【发布时间】:2020-11-01 09:22:32
【问题描述】:

我可以完全禁用 Ruby on Rails 连接池吗?

考虑到 PgBouncer 已经处理数据库连接池,这可以吗?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-5 pgbouncer


    【解决方案1】:

    没有。

    PgBouncer 将自己作为 Postgres 服务器向客户端宣传,然后管理与实际 Postgres 服务器的连接。除了 PgBouncer 之外,我们无需深入了解任何细节——从 Rails 的角度来看,PgBouncer 实例 Postgres 服务器,所以让我们解释一下为什么从那里开始。

    在 Rails 中,并发性需要考虑两个主要因素:可以向其 Web 服务器发出的入站客户端请求的数量以及数据库连接池的大小。

    如果您的连接池大小为 1,那么您的应用程序实际上是单线程的:每次发出必须进行数据库查询的入站客户端请求时,该请求都必须从池中检查到数据库的连接。当池大小为 1 且并发入站请求数大于 1 时,第一个请求之后的每个请求都必须暂停,而第一个请求完成其查询并将连接返回到池。如果第一个请求需要很长时间才能完成,那么后续请求可能会在等待池中的可用连接时超时。

    所以在 Rails 方面,您希望有一个大小大于 1 的连接池以允许并发。如果您将其设置为 1 的大小,那么您如何配置 PgBouncer 就无关紧要了; Rails 将始终与数据库建立最多一个连接,并且所有线程必须共享该单个连接。

    您可以在ActiveRecord::ConnectionAdapters::ConnectionPool < Object 阅读有关 Rails 中连接池的更多信息。

    【讨论】:

    • 感谢您的详细回答。但我在问是否可以完全禁用 Ruby 上的连接池?如何?我知道 1 的大小不好。
    • 你可以吗?不,它与 Rails 集成得太深了。您可以通过将池大小设置为 1 来有效地做到这一点吗?是的。你应该?不。(请记住,如果可以,那么每次对数据库的调用都会建立一个新连接,并且必须处理连接的建立/拆除,从而导致每个连接都慢得多)
    • 关于单线程,非常值得反驳——我不完全确定我是否有这个权利:我的印象是,对于像 Unicorn 这样的单线程服务器,你可以 如果您不启动自己的线程进行查询,请将池大小设置为 1。 Heroku 似乎推荐 1 或 2,以解决僵尸连接:devcenter.heroku.com/articles/…
    猜你喜欢
    • 2019-07-27
    • 2019-12-20
    • 2019-07-13
    • 2013-05-28
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    相关资源
    最近更新 更多