sql >> Database teknologi >  >> RDS >> PostgreSQL

Puma Cluster-konfiguration på Heroku

a) Har jeg brug for konfigurationen before_fork / after_fork som inUnicorn, da Cluster-arbejderne er fork?.

Normalt nej, men da du bruger preload_app , Ja. Forudindlæsning af appen får en forekomst op at køre og forgrener derefter hukommelsespladsen for arbejderne; resultatet er, at dine initializere kun køres én gang (muligvis allokerer db-forbindelser og sådan). I dette tilfælde er din on_worker_boot kode er passende. Hvis du ikke bruger preload_app , så starter hver medarbejder sig selv, i hvilket tilfælde brug af en initialisering ville være ideel til at konfigurere den tilpassede forbindelse, som du gør. Faktisk uden preload_app , din on_worker_boot blok ville fejle, fordi ActiveRecord og venner på det tidspunkt ikke engang er indlæst.

b) Hvordan justerer jeg mit trådantal afhængigt af min applikation - hvad ville være grunden til at droppe det? / I hvilke tilfælde ville det gøre en forskel? Er 0:16 ikke allerede optimeret?

På Heroku (og min test) er du bedst til at matche din min /max tråde med max <=DB_POOL indstilling. min tråde tillader dit program at skrue ned for ressourcer, når de ikke er under belastning, hvilket normalt er fantastisk til at frigøre ressourcer på serveren, men sandsynligvis mindre nødvendigt på Heroku; at dyno allerede er dedikeret til at betjene webanmodninger, kan lige så godt have dem klar. Mens du indstiller dit max tråde <=din DB_POOL miljøvariabel er ikke påkrævet, du risikerer at forbruge alle dine databaseforbindelser i puljen, så har du en tråd, der ønsker en forbindelse, men kan ikke få den, og du kan få den gamle "ActiveRecord::ConnectionTimeoutError - kunne ikke få en databaseforbindelse inden for 5 sekunder." fejl. Dette afhænger dog af din applikation, du kan meget vel have max> DB_POOL og have det godt. Jeg vil sige din DB_POOL skal være mindst det samme som din min tråde værdi, selvom dine forbindelser ikke er ivrigt indlæst (5:5 tråde åbner ikke 5 forbindelser, hvis din app aldrig rammer databasen).

c) Heroku-databasen tillader 500 forbindelser. Hvad ville være en god værdi for DB_POOL afhængigt af tråd-, arbejder- og dynoantal? - Kræver hver tråd pr. arbejder pr. dyno en eneste DB-forbindelse, når der arbejdes parallelt?

Produktionsniveauet tillader 500, for at være klar :)

Hver tråd pr. arbejder pr. dyno kunne bruger en forbindelse, afhængigt af om de alle forsøger at få adgang til databasen på samme tid. Normalt genbruges forbindelserne, når de er færdige, men som jeg nævnte i b) , hvis dine tråde er større end din pool, kan du have en dårlig tid. Forbindelserne vil blive genbrugt, alt dette håndteres af ActiveRecord, men nogle gange ikke ideelt. Nogle gange går forbindelser inaktive eller dør, og det er derfor, at det foreslås at tænde for Reaper for at opdage og genvinde døde forbindelser.



  1. Skift adgangskoden på SA-login i SQL Server (T-SQL-eksempel)

  2. SQL SELECT OG Operatør

  3. Forespørgsel efter element af array i JSON-kolonnen

  4. Oracle - Hvorfor forsvinder det indledende nul i et tal, når det konverteres til TO_CHAR