Ruby on rails Rails Puma失去Redis连接

Ruby on rails Rails Puma失去Redis连接,ruby-on-rails,heroku,redis,connection-pooling,puma,Ruby On Rails,Heroku,Redis,Connection Pooling,Puma,我已经环顾了其他类似的问题,但还不能很好地把事情拼凑起来。我有一个Rails应用程序(在Heroku上),它使用Puma来处理多个进程和多个线程。我的应用程序还使用Redis作为辅助数据存储(除了SQL数据库),直接查询Redis(通过connection\u poolgem)。这是我的Puma配置文件: workers Integer(ENV["WEB_CONCURRENCY"] || 4) threads_count = Integer(ENV["MAX_THREADS"] || 5) th

我已经环顾了其他类似的问题,但还不能很好地把事情拼凑起来。我有一个Rails应用程序(在Heroku上),它使用Puma来处理多个进程和多个线程。我的应用程序还使用Redis作为辅助数据存储(除了SQL数据库),直接查询Redis(通过
connection\u pool
gem)。这是我的Puma配置文件:

workers Integer(ENV["WEB_CONCURRENCY"] || 4)
threads_count = Integer(ENV["MAX_THREADS"] || 5)
threads threads_count, threads_count

preload_app!

rackup DefaultRackup
port ENV["PORT"] || 3000
environment ENV["RACK_ENV"] || "development"

on_worker_boot do
  # Worker specific setup for Rails 4.1+
  ActiveRecord::Base.establish_connection

  redis_connections_per_process = Integer(ENV["REDIS_CONNS_PER_PROCESS"] || 5)
  $redis = ConnectionPool.new(size: redis_connections_per_process) do
    Redis.new(url: ENV["REDIS_URL"] || "redis://localhost:6379/0")
  end
end
我的Redis实例的连接限制是20,我发现自己经常超过这个限制,尽管每个进程(据我所知)只有5个连接分布在4个工作进程中

事实上,当我将
Redis\u CONNS\u peru PROCESS
设置为1时,我甚至得到了
max number of clients reacted
Redis errors。是否为每个线程而不是每个进程调用启动时的

我还尝试使用一个单独的
redis.rb
初始值设定项,即使
redis\u CONNS\u PER\u PROCESS
为1,它仍然会给我带来错误。这似乎有点奇怪,因为如果我正确地计算,我应该可以将其设置为4(4个工作进程+1个主进程)*每个进程4个连接。(请注意,出于这个问题的目的,我忽略了部署过程中出现的错误,因为我假设Heroku可能在该过程中连接新旧进程,即使我没有使用Preboot。)


我哪里会误解这一切是如何结合在一起的?

在进一步阅读和测试之后,我最终将我的Redis连接池代码移到了一个单独的初始值设定项中。不幸的是,这根本没有解决我的问题,尽管对进程和连接号进行了大量的修补,但我仍然比我本应达到的
最大客户端数
错误的方式早


答案是,将Redis提供商从Heroku Redis切换到Redis云。我不知道为什么Heroku Redis不允许它发布的连接数,但经过一些调查,Redis Cloud实际上允许比发布的连接数更多的连接(或者至少透明且无错误地限制连接),没有任何问题。哇!他们当然赢得了我的生意。

在进一步阅读和测试之后,我最终将我的Redis连接池代码移到了一个单独的初始值设定项中。不幸的是,这根本没有解决我的问题,尽管对进程和连接号进行了大量的修补,但我仍然比我本应达到的
最大客户端数
错误的方式早


答案是,将Redis提供商从Heroku Redis切换到Redis云。我不知道为什么Heroku Redis不允许它发布的连接数,但经过一些调查,Redis Cloud实际上允许比发布的连接数更多的连接(或者至少透明且无错误地限制连接),没有任何问题。哇!他们当然赢得了我的生意。

我也有类似的问题。起初我使用的是redis togo,它没有问题。但在我从redis togo改为Heroku redis后,我得到了“ERR max number of clients ATHED”错误

我的应用程序代码没有更改,只有redis提供商的更改

我在Heroku支持中心开了一张罚单,他们建议我更改超时值的默认设置

在我更改Heroku redis的默认超时值后,所有问题都解决了。 我猜redis超时的默认值与redis提供者不同。Heroku redis的默认设置为0。 “值为零表示连接将不会关闭。”


我希望我的经验对你有帮助

我也有类似的问题。起初我使用的是redis togo,它没有问题。但在我从redis togo改为Heroku redis后,我得到了“ERR max number of clients ATHED”错误

我的应用程序代码没有更改,只有redis提供商的更改

我在Heroku支持中心开了一张罚单,他们建议我更改超时值的默认设置

在我更改Heroku redis的默认超时值后,所有问题都解决了。 我猜redis超时的默认值与redis提供者不同。Heroku redis的默认设置为0。 “值为零表示连接将不会关闭。”


我希望我的经验对你有帮助

我也遇到了这个问题,虽然Heroku Redis仪表板只显示了一些连接,但我的连接已经用完了

然后我联系了Heroku支持部门,他们告诉我,仪表板只显示活动客户机/连接,而不是空闲客户机/连接

因此,由于Redis超时为0(从不超时),重新启动时,Redis连接将处于空闲状态,并打开新连接。因此,每次重新启动时情况都会变得更糟

如本页其他人所述,解决方案是将超时设置为0以外的值:

heroku redis:timeout -s 10 -a APPLICATION_NAME
这会使连接在10秒后消失,这应该不是问题,因为在使用连接时,它将保持打开状态(没有不必要的关闭)


当你只有很少的流量时,你可以考虑把这个设置为高一点。

我也遇到了这个问题,而Heluu Read仪表板只显示了几个连接,我的连接就没有了。

然后我联系了Heroku支持部门,他们告诉我,仪表板只显示活动客户机/连接,而不是空闲客户机/连接

因此,由于Redis超时为0(从不超时),重新启动时,Redis连接将处于空闲状态,并打开新连接。因此,每次重新启动时情况都会变得更糟

如本页其他人所述,解决方案是将超时设置为0以外的值:

heroku redis:timeout -s 10 -a APPLICATION_NAME
这会使连接在10秒后消失,这应该不是问题,因为在使用连接时,它将保持打开状态(没有不必要的关闭)

当你有