a) Имам ли нужда от конфигурацията before_fork / after_fork като inUnicorn, тъй като работниците на Cluster са разклонени?.
Обикновено не, но тъй като използвате preload_app
, да. Предварителното зареждане на приложението води до стартиране и стартиране на екземпляр и след това разклонява пространството в паметта за работниците; резултатът е, че вашите инициализатори се изпълняват само веднъж (евентуално разпределяне на db връзки и други подобни). В този случай вашият on_worker_boot
кодът е подходящ. Ако не използвате preload_app
, тогава всеки работник се зарежда сам, като в този случай използването на инициализатор би било идеално за настройка на персонализираната връзка, както правите. Всъщност без preload_app
, вашият on_worker_boot
блокът ще се появи грешка, защото в този момент ActiveRecord и приятелите дори не са заредени.
b) Как да настроя броя на нишките си в зависимост от моето приложение - каква би била причината да го пусна? / В какви случаи би имало значение? 0:16 не е ли вече оптимизиран?
На Heroku (и моето тестване) вие най-добре отговаряте на вашите min
/max
нишки, с max
<=DB_POOL
настройка. min
threads позволява на приложението ви да намалява ресурси, когато не е под товар, което обикновено е чудесно за освобождаване на ресурси на сървъра, но вероятно по-малко необходимо на Heroku; че dyno вече е предназначен за обслужване на уеб заявки, може също така да ги подготви и да е готов. Докато задавате своя max
нишки <=вашият DB_POOL
променливата на средата не се изисква, рискувате да консумирате всичките си връзки към базата данни в пула, тогава имате нишка, която иска връзка, но не може да я получи, и можете да получите стария „ActiveRecord::ConnectionTimeoutError - не може да получите връзка с база данни в рамките на 5 секунди." грешка. Това обаче зависи от вашето приложение, много добре бихте могли да имате max
> DB_POOL
и бъди добре. Бих казал вашият DB_POOL
трябва да е поне същото като min
стойност на нишките, въпреки че връзките ви не се зареждат нетърпеливо (нишките 5:5 няма да отварят 5 връзки, ако приложението ви никога не достига базата данни).
в) Базата данни Heroku позволява 500 връзки. Каква би била добра стойност за DB_POOL в зависимост от броя на нишките, работния файл и dyno? - Всяка нишка на работник на dyno изисква ли единствена DB връзка, когато работи паралелно?
Производственото ниво позволява 500, за да е ясно :)
Всяка нишка на работник на dyno може консумират връзка, в зависимост от това дали всички се опитват да получат достъп до базата данни по едно и също време. Обикновено връзките се използват повторно, след като са готови, но както споменах в b)
, ако вашите нишки са по-големи от вашия пул, можете да прекарате лошо време. Връзките ще бъдат използвани повторно, всичко това се обработва от ActiveRecord, но понякога не идеално. Понякога връзките не работят или умират и затова се препоръчва да включите Reaper, за да откриете и възстановите мъртвите връзки.