使用 Redis 和 Unicorn 连接池的好处

Benefits of connection pooling with Redis and Unicorn

背景:我有一个 Ruby/Rails + Nginx/Unicorn 网络应用程序连接到多个 Redis 数据库(即我没有使用 Redis.current 而是为我的不同连接使用全局变量).我知道当创建一个新的 Unicorn worker 时,我需要在 after_fork 块中创建一个新连接,如 here and here.

所述

我的问题是关于连接池的必要性。根据 this SO 线程,"In Unicorn each process establishes its own connection pool, so you if your db pool setting is 5 and you have 5 Unicorn workers then you can have up to 25 connections. However, since each unicorn worker can handle only one connection at a time, then unless your app uses threading internally each worker will only actually use one db connection... Having a pool size greater than 1 means each Unicorn worker has access to connections it can't use, but it won't actually open the connections, so that doesn't matter."

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

仅当 ActiveRecord 与 databases.yml 配置文件中定义的 SQL 数据库 通信时才使用连接池。它与 Redis 完全无关,您引用的 SO 答案实际上与 Redis 无关。

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

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

  1. 使用 unicorn,其 worker 是分开的、独立的 进程,而不是线程,
  2. after_fork 期间打开一个(或两个)稳定连接,然后在 unicorn worker 存在期间一直打开该连接
  3. 不要在您的应用程序中的任何地方使用线程(我会再次检查这是否属实 - 不仅是 Sidekiq,而且可能是任何倾向于在后台执行操作的 gem)。

在这种情况下,与 Redis 的池连接对我来说毫无意义,因为似乎没有代码可以从重用连接中获益 - 它始终处于打开状态。