我们在生产中使用 Sneakers gem 进行大型应用程序。有时负载可能非常巨大,以至于一个特定的队列可能包含超过 250_000 条消息。在这种情况下,例外
ActiveRecord::ConnectionTimeoutError:
could not obtain a connection from the pool within 5.000 seconds (waited 5.000 seconds); all pooled connections were in use
定期发生。
对于数据库,我们使用基于 PostgreSQL 9.6 的 Amazon RDS。max_connections
PostgreSQL 配置值为 3296。
我们的database.yml
文件:
production:
adapter: postgresql
encoding: utf8
pool: 40
database: <%= ENV['RDS_DB_NAME'] %>
username: <%= ENV['RDS_USERNAME'] %>
password: <%= ENV['RDS_PASSWORD'] %>
host: <%= ENV['RDS_HOSTNAME'] %>
port: <%= ENV['RDS_PORT'] %>
我想我们可以增加一个pool
值,但我找不到有关如何计算最大可能值的信息,所以它不会破坏任何东西。
此外,使用 Sneakers gem 进行后台处理的应用程序副本单独存在(但使用相同的数据库)并且可以单独配置。但是现在它具有相同的database.yml
配置。运动鞋 gem 配置文件:
production:
heartbeat: 2000
timeout_job_after: 35
exchange_type: :fanout
threads: 4
prefetch: 4
durable: true
ack: true
daemonize: true
retry_max_times: 5
retry_timeout: 2000
workers: 4
我们在基本运行时应用程序中的连接池没有问题,但ActiveRecord::ConnectionTimeoutError
经常发生在工作人员中,这是一个非常大的问题。
所以,请帮我重新配置databese.yml
文件:
pool
如果数据库max_connections
值为 3296 ,如何正确计算选项的最大可能值?pool
将 Sneakers gem 与上述配置一起使用时,如何正确计算选项的最大可能值?- 或者,如果我的配置很好,我该如何避免
ActiveRecord::ConnectionTimeoutError
在工人中?
提前致谢。