【发布时间】:2015-10-26 22:10:27
【问题描述】:
我已经查看了关于 SO 的其他类似问题,但还不能很好地组合在一起。我有一个 Rails 应用程序(在 Heroku 上),它使用 Puma 和多进程和多线程。我的应用程序还使用 Redis 作为辅助数据存储(除了 SQL 数据库),直接查询 Redis(嗯,通过 connection_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_CONNS_PER_PROCESS 设置为1 时,我什至得到max number of clients reached Redis 错误。on_worker_boot 是为每个线程而不是每个进程调用的吗?
我还尝试使用单独的 redis.rb 初始化程序,即使 REDIS_CONNS_PER_PROCESS 为 1,它仍然会给我错误。这似乎很奇怪,因为如果我在做数学,我应该能够将它增加到 4正确(4 个工作进程 + 1 个主进程)* 每个进程 4 个连接。 (请注意,出于这个问题的目的,我忽略了部署过程中发生的错误,因为我假设 Heroku 可能在该过程中同时连接新旧进程,即使我没有使用 Preboot。)
我在哪里误解了这一切是如何结合在一起的?
【问题讨论】:
标签: ruby-on-rails heroku redis connection-pooling puma