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

Configurazione Puma Cluster su Heroku

a) Ho bisogno della configurazione before_fork / after_fork come inUnicorn, dal momento che i cluster worker sono forkati?.

Normalmente no, ma dal momento che stai usando preload_app , sì. Il precaricamento dell'app rende un'istanza attiva e funzionante e quindi esegue il fork dello spazio di memoria per i lavoratori; il risultato è che i tuoi inizializzatori vengono eseguiti solo una volta (possibilmente allocando connessioni db e simili). In questo caso, il tuo on_worker_boot il codice è appropriato. Se non stai utilizzando preload_app , quindi ogni lavoratore si avvia da solo, nel qual caso l'utilizzo di un inizializzatore sarebbe l'ideale per configurare la connessione personalizzata come stai facendo. Infatti, senza preload_app , il tuo on_worker_boot blocco si verificherebbe un errore perché a quel punto ActiveRecord e gli amici non vengono nemmeno caricati.

b) Come posso regolare il conteggio dei thread in base alla mia applicazione:quale sarebbe il motivo per eliminarlo? / In quali casi farebbe la differenza? 0:16 non è già ottimizzato?

Su Heroku (e sui miei test) è meglio che corrisponda al tuo min /max thread, con max <=DB_POOL collocamento. Il min threads consente alla tua applicazione di ridurre le risorse quando non è sotto carico, il che normalmente è ottimo per liberare risorse sul server, ma probabilmente meno necessario su Heroku; che dyno è già dedicato a servire le richieste web, potrebbe anche averle aperte e pronte. Durante l'impostazione del tuo max thread <=il tuo DB_POOL la variabile di ambiente non è richiesta, corri il rischio di consumare tutte le connessioni al database nel pool, quindi hai un thread che desidera una connessione ma non riesci a ottenerla e puoi ottenere il vecchio "ActiveRecord::ConnectionTimeoutError - Impossibile ottenere una connessione al database entro 5 secondi." errore. Questo dipende dalla tua applicazione però, potresti benissimo avere max> DB_POOL e stare bene. Direi il tuo DB_POOL dovrebbe essere almeno uguale al tuo min valore dei thread, anche se le tue connessioni non vengono caricate avidamente (i thread 5:5 non apriranno 5 connessioni se la tua app non raggiunge mai il database).

c) Il database di Heroku consente 500 connessioni. Quale sarebbe un buon valore per DB_POOL a seconda del conteggio di thread, worker e dyno? - Ogni thread per lavoratore per banco prova richiede una sola connessione DB quando si lavora in parallelo?

Il livello di produzione consente 500, per essere chiari :)

Ogni thread per lavoratore per banco prova potrebbe consumano una connessione, a seconda che stiano tentando tutti di accedere al database contemporaneamente. Di solito le connessioni vengono riutilizzate una volta terminate, ma come ho detto in b) , se i tuoi thread sono più grandi del tuo pool puoi passare un brutto momento. Le connessioni verranno riutilizzate, tutto questo è gestito da ActiveRecord, ma a volte non idealmente. A volte le connessioni diventano inattive o muoiono, ed è per questo che si suggerisce di accendere il Mietitore per rilevare e recuperare le connessioni morte.