Pregunta Node.JS con forever en Heroku


Entonces, necesito ejecutar mi aplicación node.js en heroku, funciona muy bien, pero cuando mi aplicación falla, necesito algo para reiniciarla, así que agregué para siempre a package.json, y creé un archivo llamado forever.js con esta:

var forever = require('forever');

var child = new (forever.Monitor)('web.js', {
  max: 3,
  silent: false,
  options: []
});

//child.on('exit', this.callback);
child.start();

forever.startServer(child);

en mi Procfile (que heroku usa para saber qué comenzar) pongo:

web: node forever.js

¡bien! Ahora, cada vez que mi aplicación falla, se reinicia automáticamente, pero, de vez en cuando (casi cada 1 hora), heroku comienza a lanzar H99 - Error de plataforma, y ​​sobre este error, dicen:

A diferencia de todos los otros errores que requerirá que usted corrija, este no requiere ninguna acción suya. Inténtalo de nuevo en un minuto o revisa el sitio de estado.

Pero simplemente reinicio manualmente mi aplicación y el error desaparece; si no lo hago, puede llevar horas desaparecer por sí solo.

¿Me puede ayudar alguien? Tal vez este es un problema para siempre? ¿Un problema heroku?


10
2017-12-28 14:00


origen


Respuestas:


Este es un problema con las cuentas gratuitas de Heroku: Heroku automáticamente mata las aplicaciones no pagas después de 1 hora de inactividad, y luego las devuelve la próxima vez que entre una solicitud. (Como se menciona a continuación, esto no se aplica a las cuentas pagas. hasta dos servidores y paga por el segundo, obtienes dos servidores siempre activos). https://devcenter.heroku.com/articles/dynos#dyno-sleeping

Este comportamiento probablemente no está jugando muy bien con forever. Para confirmar esto, ejecuta heroku logs y busque las líneas "al ralentí" y "detener el proceso con SIGTERM" y luego vea qué viene después.

En lugar de usar forever, es posible que desee probar el uso de la API de clúster y crear automáticamente un nuevo elemento secundario cada vez que muera. http://nodejs.org/api/cluster.html#cluster_cluster es un buen ejemplo, pondrías tu código en el else bloquear.

El resultado es que su aplicación ahora es mucho más estable y además usa todos los núcleos de CPU disponibles (4 en mi experiencia).

La desventaja es que no puede almacenar ningún estado en la memoria. Si necesita almacenar sesiones o algo similar, pruebe el complemento gratuito Redis To Go (heroku addons:add redistogo)

Aquí hay un ejemplo que se está ejecutando actualmente en heroku usando cluster y Redis To Go: https://github.com/nfriedly/node-unblocker

ACTUALIZACIÓN: Heroku ha realizado recientemente algunos cambios importantes en el funcionamiento de las aplicaciones gratuitas, y la gran es que solo pueden estar en línea durante un máximo de 18 horas por día, por lo que es realmente inutilizable como un servidor web "real". Detalles en https://blog.heroku.com/archives/2015/5/7/heroku-free-dynos

ACTUALIZACIÓN 2: Lo cambiaron de nuevo. Ahora, si verificas tu ID, puedes ejecutar 1 dyno gratis constantemente: https://blog.heroku.com/announcing_heroku_free_ssl_beta_and_flexible_dyno_hours#flexible-free-dyno-hours


9
2017-07-25 21:54