a) Czy potrzebuję konfiguracji before_fork / after_fork, takiej jak w Unicorn, ponieważ pracownicy klastra są rozwidleni?
Zwykle nie, ale ponieważ używasz preload_app
, tak. Wstępne ładowanie aplikacji uruchamia instancję, a następnie rozdziela przestrzeń pamięci dla pracowników; rezultatem jest to, że twoje inicjatory zostaną uruchomione tylko raz (prawdopodobnie przydzielą połączenia db i tym podobne). W tym przypadku Twój on_worker_boot
kod jest odpowiedni. Jeśli nie używasz preload_app
, następnie każdy pracownik uruchamia się sam, w takim przypadku użycie inicjatora byłoby idealne do skonfigurowania połączenia niestandardowego, tak jak robisz to. W rzeczywistości bez preload_app
, Twój on_worker_boot
blok wyłączyłby błąd, ponieważ w tym momencie ActiveRecord i przyjaciele nie są nawet ładowani.
b) Jak dostroić liczbę wątków w zależności od aplikacji - jaki byłby powód, aby ją usunąć? / W jakich przypadkach miałoby to znaczenie? Czy 0:16 nie jest już zoptymalizowane?
W Heroku (i moich testach) najlepiej pasujesz do min
/max
wątki, z max
<=DB_POOL
ustawienie. min
wątki umożliwiają aplikacji zwalnianie zasobów, gdy nie są obciążone, co zwykle jest świetne, jeśli chodzi o zwolnienie zasobów na serwerze, ale prawdopodobnie jest mniej potrzebne w Heroku; że hamownia jest już przeznaczona do obsługi żądań internetowych, równie dobrze może je mieć gotowe i gotowe. Podczas ustawiania max
wątki <=Twój DB_POOL
zmienna środowiskowa nie jest wymagana, ryzykujesz zużycie wszystkich połączeń z bazą danych w puli, wtedy masz wątek, który chce połączenia, ale nie może go uzyskać, i możesz uzyskać stary "ActiveRecord::ConnectionTimeoutError - nie mógł uzyskaj połączenie z bazą danych w ciągu 5 sekund." błąd. Zależy to jednak od twojej aplikacji, możesz mieć max
> DB_POOL
i bądź w porządku. Powiedziałbym, że twój DB_POOL
powinien być co najmniej taki sam jak Twój min
wartość wątków, nawet jeśli połączenia nie są chętnie ładowane (wątki 5:5 nie otworzą 5 połączeń, jeśli Twoja aplikacja nigdy nie trafi do bazy danych).
c) Baza danych Heroku pozwala na 500 połączeń. Jaka byłaby wartość goodvalue dla DB_POOL w zależności od liczby wątków, pracowników i hamowni? - Czy każdy wątek na pracownika na hamownię wymaga pojedynczego połączenia z bazą danych podczas pracy równoległej?
Poziom produkcji pozwala na 500, żeby było jasne :)
Każdy wątek na pracownika na hamownię może zużywają połączenie, w zależności od tego, czy wszyscy jednocześnie próbują uzyskać dostęp do bazy danych. Zwykle połączenia są ponownie używane po zakończeniu, ale jak wspomniałem w b)
, jeśli twoje wątki są większe niż twoja pula, możesz mieć zły czas. Połączenia zostaną ponownie użyte, wszystko to jest obsługiwane przez ActiveRecord, ale czasami nie idealnie. Czasami połączenia przestają działać lub giną, dlatego sugeruje się włączenie Żniwiarza, aby wykryć i odzyskać martwe połączenia.