Come scalare correttamente l’app nodejs su heroku usando i cluster

Ho notato un avviso nei registri di heroku che ultimamente diceva che mi sembrava nuovo

web.1: rilevata 512 MB di memoria disponibile, limite di 512 MB per processo (WEB_MEMORY)

web.1: Recommending WEB_CONCURRENCY = 1

Ho fatto alcune ricerche e ho trovato questo articolo del cluster , che è il modo “predefinito” per usare i cluster in nodejs, ma è totalmente in contraddizione con un articolo appena aggiornato che contiene questa nuova variabile d’ambiente WEB_CONCURRENCY e con un suggerimento di dimensioni diverse per ogni banco è molto più piccolo, btw)

Il primo collegamento è a partire da luglio 2014 ed era il modo consigliato di fare le cose. Tuttavia, i dynos di Heroku sono abbastanza incentrati sulla memoria, ed è molto facile superare il limite di memoria assegnato quando si utilizza il numero massimo di core per CPU (come suggerisce il primo articolo).

Invece, la nuova raccomandazione è di profilare la tua app e capire quanta memoria è necessaria per processo. Impostare una variabile di ambiente WEB_MEMORY su questo valore, quindi aggiornare il codice cluster nel modo seguente:

 var cluster = require('cluster'); var numWorkers = process.env.WEB_CONCURRENCY; if(cluster.isMaster) { // Master process: fork our child processes for (var i = 0; i < numWorkers; i++) { cluster.fork(); } // Respawn any child processes that die cluster.on('exit', function() { cluster.fork(); }); } else { // Child process, put app initialisation code here. } 

Usando la variabile WEB_MEMORY , Heroku può generare un valore WEB_CONCURRENCY base alle dimensioni del banco prova in esecuzione e quindi assegnare il numero corretto di processi per garantire che l'app non superi il limite di memoria.

Per inciso, se superi l'allocazione di memoria (512 MB per dyno per un dyno 1x), lo spazio di swap verrà utilizzato per l'eccesso. Ciò rallenterà la tua app, causando un aumento dei tempi di richiesta e in generale contribuirà a rallentare. Se superi l'utilizzo della memoria di troppo (circa tre volte l'allocazione), Heroku riavvierà il tuo banco.