Мы используем в производстве кроссовки для большого приложения.И иногда загрузка может быть настолько большой, что одна конкретная очередь может содержать более 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
.
Для базы данных мы используем Amazon RDS на основе PostgreSQL 9.6.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 живет отдельно (но использует ту же базу данных) и может быть настроена индивидуально.Но сейчас у него тот же конфиг 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 с конфигами выше? - Или, если мои конфиги хороши, как я могу избежать
ActiveRecord::ConnectionTimeoutError
у рабочих?
Заранее спасибо.