Ответ 1
a) Мне нужна конфигурация before_fork/after_fork, как в Единорог, так как рабочие кластера раздвоены?.
Обычно нет, но поскольку вы используете preload_app
, да. Предварительная загрузка приложения запускает и запускает экземпляр, а затем разворачивает пространство памяти для рабочих; результат состоит в том, что ваши инициализаторы только запускают один раз (возможно, выделяя соединения db и т.д.). В этом случае ваш код on_worker_boot
подходит. Если вы не используете preload_app
, каждый рабочий загружается сам, и в этом случае использование инициализатора идеально подходит для настройки настраиваемого соединения, как вы делаете. Фактически, без preload_app
ваш блок on_worker_boot
будет ошибочным, потому что в этот момент ActiveRecord и друзья даже не загружены.
b) Как настроить количество потоков в зависимости от моего приложения - что было бы причиной его падения?/В каких случаях это сделало бы разница? Не оптимизировано ли 0:16?
На Heroku (и моем тестировании) вам лучше всего соответствовать вашим тегам min
/max
, с настройкой max
<= DB_POOL
. Потоки min
позволяют вашему приложению отжимать ресурсы, когда они не находятся под нагрузкой, что обычно отлично подходит для освобождения ресурсов на сервере, но, вероятно, менее необходимо для Heroku; этот dyno уже предназначен для обслуживания веб-запросов, может также иметь их вверх и готов. При установке переменной окружения max
threads <= your DB_POOL
не требуется, вы рискуете использовать все соединения с базой данных в пуле, тогда у вас есть поток, требующий подключения, но не могу получить его, и вы можете получить старый "ActiveRecord:: ConnectionTimeoutError", который не смог получить соединение с базой данных в течение 5 секунд ". ошибка. Это зависит от вашего приложения, но вы вполне могли бы иметь max
> DB_POOL
и быть в порядке. Я бы сказал, что ваш DB_POOL
должен быть, по крайней мере, таким же, как ваше значение потоков min
, даже если ваши соединения не загружаются с высокой загрузкой (5: 5 потоков не будут открывать 5 соединений, если ваше приложение никогда не попадает в базу данных).
c) База данных Heroku позволяет 500 подключений. Что было бы хорошо значение для DB_POOL в зависимости от потока, рабочего и динамического счета? - Делает каждый поток на одного рабочего на дино требует единственного соединения БД, когда работая параллельно?
Уровень Производственный уровень позволяет получить четкость:)
Каждый поток на одного рабочего на динамод может использовать соединение, в зависимости от того, все ли они пытаются получить доступ к базе данных одновременно. Обычно соединения повторяются, как только они выполняются, но, как я упоминал в b)
, если вы потоки больше, чем ваш пул, вы можете иметь плохое время. Соединения будут использоваться повторно, все это обрабатывается ActiveRecord, но иногда не идеально. Иногда соединения простаивают или умирают, и поэтому рекомендуется включить Reaper для обнаружения и восстановления мертвых соединений.