【问题标题】:Benefits of connection pooling with Redis and Unicorn使用 Redis 和 Unicorn 进行连接池的好处
【发布时间】:2016-10-08 01:12:00
【问题描述】:

背景:我有一个 Ruby/Rails + Nginx/Unicorn Web 应用程序,它连接到多个 Redis DB(即我没有使用Redis.current,而是使用全局变量来进行不同的连接)。我知道当创建新的 Unicorn 工作人员时,我需要在 after_fork 块中创建一个新连接,如 here 和 here 所述。

我的问题是关于连接池的需要。根据this SO 线程,“在 Unicorn 中,每个进程都会建立自己的连接池,因此如果您的数据库池设置为 5,并且您有 5 个 Unicorn 工作者,那么您最多可以有 25 个连接。但是,由于每个unicorn worker 一次只能处理一个连接,那么除非您的应用程序在内部使用线程,否则每个 worker 实际上只会使用一个 db 连接......池大小大于 1 意味着每个 Unicorn worker 都可以访问它无法使用的连接,但它实际上不会打开连接,所以没关系。”

由于我没有使用 Sidekiq,我什至需要为我的 Redis 连接使用连接池吗?池大小为 1 的连接池有什么好处吗?或者我应该简单地使用具有单个连接的变量 - 例如Redis.new(url: ENV["MY_CACHE"])?

【问题讨论】:

    标签: ruby-on-rails redis connection-pooling unicorn


    【解决方案1】:

    连接池仅在 ActiveRecord 与您的 databases.yml 配置文件中定义的 SQL 数据库 对话时使用。它根本与 Redis 无关,您引用的 SO 答案实际上与 Redis 无关。

    因此,除非您想为 Redis 使用一些 custom connection pool solution,否则您根本不必处理它,因为默认情况下 Rails 中没有用于 Redis 的池。我猜如果您的应用程序中有多个线程,而您的情况并非如此,那么自定义池可能是合适的。

    更新:在您的场景中构建连接池有意义吗?我对此表示怀疑。 Connection pool 是一种重用打开连接(通常在多个线程/请求之间)的方法。但是你说你:

    1. 使用独角兽,其工作人员是独立的进程,而不是线程,
    2. 在after_fork 期间打开一个稳定的连接(或两个),然后在独角兽工人生活的所有时间都打开一个连接
    3. 不要在您的应用程序中的任何地方使用线程(我会再次检查这是否属实 - 它不仅是 Sidekiq,而且可能是任何倾向于在后台执行操作的 gem)。

    在这种情况下,与 Redis 的连接池对我来说毫无意义,因为似乎没有代码可以从重用连接中受益 - 无论如何它一直都是打开的。

    【讨论】:

    • 是的,我问的是创建自定义连接池的好处。我没有使用 ActiveRecord,所以我知道我没有通过它使用连接池。
    • 好的,这对我来说很有意义。谢谢!
    猜你喜欢
    • 2020-06-20
    • 2016-06-03
    • 2021-01-01
    • 2014-03-25
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2016-05-19
    • 2019-02-01
    相关资源
    最近更新 更多