gpt4 book ai didi

ruby-on-rails - 使用 Redis 和 Unicorn 连接池的好处

转载 作者:IT王子 更新时间:2023-10-29 05:59:28 24 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

在这种情况下,将连接池连接到 Redis 对我来说毫无意义,因为似乎没有代码可以从重用连接中获益——无论如何它一直处于打开状态。

关于ruby-on-rails - 使用 Redis 和 Unicorn 连接池的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37691120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com