¿Manera fácil de evitar que Heroku esté inactivo?

285

En las aplicaciones gratuitas de Heroku, los dinamómetros parecen estar inactivos: mi aplicación tiene muy poco tráfico pero tampoco es realmente aceptable en mi caso que mis usuarios tengan que esperar más de 20 segundos para activar un nuevo dinamómetro.

Francamente, con ese tipo de espera, muchos se irán antes de que aparezca la primera página.

Entonces, tengo un problema: ¿debería pagar $ 36 por mes para ahorrarle a cada usuario 20 segundos vergonzosamente largos cuando mi tráfico es de un solo dígito por día.

¿¿Hay alguna forma de evitar esto??

sscirrus
fuente
13
A partir del 1 de julio de 2015, esto ya no será posible, según el anuncio de Heroku: blog.heroku.com/archives/2015/5/7/heroku-free-dynos . Sin embargo, introdujeron un plan de "pasatiempo" que cuesta solo $ 7 / mes.
Cristian
1
Ahora hay servidores virtuales disponibles por $ 5 / mes (o menos facturados por hora) que brindan acceso completo al shell, etc. He usado DigitalOcean durante más de un año, pero estoy seguro de que hay otros en el espacio para competir. OMI, una mejor solución si Heroku ya no es libre ..
sricks
1
@sricks Un VPS completo (que necesita administrar, mantener actualizado, configurar un servidor Git, servidor web, servidor DB, firewall, ganchos Git, copias de seguridad, WAL-E, etc., etc., etc.) es algo diferente de Heroku ( un PaaS). En algunos casos, desea lo primero, en otros lo último, pero los dólares en bruto deben ser una métrica principal. El tiempo y el riesgo deberían ser.
elithrar
¿Cómo instalar el agente New Relic en la aplicación RoR? newrelic.com/ruby
Manny Quintanilla
1
A partir del 1 de junio de 2016, esto es posible nuevamente si verifica con una tarjeta de crédito. El anuncio . Obtendrá 1000 horas gratuitas al mes, y solo hay 730 horas en un mes. Suponiendo que solo tiene un banco de pruebas en funcionamiento, puede ir de forma gratuita las 24 horas, los 7 días de la semana.
Papa al horno

Respuestas:

351

Puedes instalar el complemento gratuito New Relic . Tiene una función de monitor de disponibilidad que hará ping a su sitio dos veces por minuto, evitando así que el banco de pruebas esté inactivo.

Más o menos la misma solución que Jesse, pero quizás más integrado a Heroku ... Y con algunas ventajas (la supervisión del rendimiento es simplemente genial).

Monitoreo de disponibilidad

Nota: para todos los que dicen que no funciona: la parte importante en mi respuesta es "monitor de disponibilidad". Solo instalar el complemento no ayudará. También debe configurar el monitoreo de disponibilidad con la URL de su aplicación heroku.

Pierre
fuente
66
¿tenemos que instalar también la gema 'newrelic_rpm' para evitar que el banco de pruebas esté inactivo?
simo
3
¿Cuánto aumenta esto el uso de dinamómetro?
Trevoke
44
Acabo de descubrir esto hace poco. Se hace aún funciona excelentemente. Sin embargo, por si acaso, me aseguro de hacer una simple consulta de base de datos antes de mostrar un mensaje de 'Aplicación disponible'. Esto también funciona muy bien con Pagoda y cualquier otro host soñoliento.
Jacob Evan Shreve
8
@aubraus: su edición fue rechazada ... De todos modos: para todos aquellos que dicen que no funciona: la parte importante en mi respuesta es "monitor de disponibilidad". Solo instalar el complemento no ayudará. También debe configurar el monitoreo de disponibilidad con la URL de su aplicación heroku.
Pierre
13
En caso de que alguien todavía esté buscando esto, el enlace directo para el ping está aquí: synthetics.newrelic.com/accounts/[your_account_idfont>/monitors/new Solo ingrese su ID de cuenta.
Eric Yang
91

Como alternativa a Pingdom, sugiero probar Uptimerobot . Es gratis y ofrece un control del sitio a intervalos de 5 minutos. Funciona muy bien para mi.

ACTUALIZACIÓN 7 de mayo de 2015: Esto ya no será posible, ya que Heroku cambiará su dinamómetro gratuito para evitar mantenerlo vivo durante 24 horas:

Otro cambio importante tiene que ver con el dinamómetro o "inactivo". Si bien las aplicaciones no pagas siempre han dormido después de un tiempo de espera de actividad, algunas aplicaciones utilizan servicios de ping automáticos para evitar ese comportamiento. Las dinamómetros gratuitas están permitidas 18 horas despierto por período de 24 horas, y en las próximas semanas comenzaremos a notificar a los usuarios sobre las aplicaciones que excedan ese límite. Con la introducción del dinamómetro hobby ($ 7 por mes), le pedimos que deje que su aplicación duerma después del tiempo de espera o que actualice a esta nueva opción.

¿Cuándo será esto en vivo? Según su publicación de blog:

Las aplicaciones que ejecutan un único dinamómetro 1X que no acumula ninguna otra carga de dinamómetro se migrarán gradualmente al nuevo dinamómetro gratuito a partir del 1 de julio .

Cristian
fuente
1
Uptimerobot parece estar (irónicamente) abajo. Puede registrarse e iniciar sesión, pero si intenta agregar un nuevo monitor, solo dice "monitor ya
Jeff Axelrod
Parece funcionar bastante bien, bueno ... Entiendo que heroku duerme mucho en los servicios gratuitos, pero apesta cuando se aloja un coordinador central (que por naturaleza no se puede escalar).
jonasfj 01 de
No pude hacer esto ya que Uptimerobot requiere una dirección IP. No puedo ver cómo hacer que funcione con una url, como una url herokuapp. EDITAR: Mi mal, estaba poniendo http://y obteniendo un error.
Ruben Martinez Jr.
1
La gran diferencia es que los intervalos de 5 minutos significan que pasarán 5 minutos antes de recibir una notificación si está inactivo. Usamos Pingometer ( pingometer.com ) que tiene intervalos de 1 minuto y ha sido genial con Heroku.
okoboko
9
A partir de abril de 2017, el límite de 18 horas ha desaparecido, puede tener su banco de pruebas gratis las 24 horas del día, los 7 días de la semana, siempre que su cuenta esté verificada. devcenter-staging.heroku.com/articles/free-dyno-hour-faq .
bagonyi
76

En mi opinión, el uso del nivel 'gratuito' del servicio no debería impulsar una producción o una aplicación orientada al cliente. Si bien las soluciones anteriores funcionan contra el ralentí Dyno, piense detenidamente sobre lo que está haciendo.

Por lo menos, use un trabajo cron para hacer ping a su sitio y desactive la verificación de períodos conocidos de bajo uso (es decir, durante la noche) para asegurarse de que Heroku no elimine el nivel gratuito para todos los demás.

drowe
fuente
Gracias por tu respuesta. ¿Qué quieres decir específicamente con 'pensar detenidamente sobre lo que estás haciendo'?
sscirrus
36
Principalmente para las personas que leen las respuestas anteriores para esta solución. El objetivo del nivel gratuito en Heroku no es alojar una aplicación de producción que deba estar disponible para los clientes. El ralentí de nivel gratuito le permite a Heroku ofrecer este nivel para desarrollo / prueba, sin un gran costo general de servidores que se ejecutan constantemente.
drowe
29
También está bien para un sitio de "producción" con poco tráfico y sin clientes que pagan, que no desea esperar treinta segundos para que se cargue la primera página.
alxndr
2
Tienes razón, pero hay muchas razones válidas para ejecutar un banco de pruebas ... como tener un solo coordinador con algún estado en la memoria ...
jonasfj
17
No sabes mucho acerca de su aplicación, así que creo que tu comentario es bastante crítico.
wobbily_col
60

También puedes probar http://kaffeine.herokuapp.com (hecho por mí), está hecho para evitar que las aplicaciones de Heroku se apaguen. Hará ping a su aplicación cada 10 minutos para que su aplicación no se suspenda. Es completamente gratis.

Romain
fuente
1
¿Es posible eliminar su herokuapp de su servicio?
meteorito
2
Ya no acepta nuevas aplicaciones. Su página de GitHub contiene varios problemas al respecto. Esta respuesta puede considerarse obsoleta ahora.
nickolay.laptev
45

Puede usar http://pingdom.com/ para verificar su aplicación; si se hace cada minuto más o menos, heroku no inactivará su aplicación y no tendrá que girar.

Jesse Wolgamott
fuente
2
¡Tan difícil de decidir entre las dos respuestas! Al final fui con Newrelic porque ya tengo una cuenta allí. Muchas gracias por esta gran sugerencia: en realidad también resolvió mi problema. :) +1.
sscirrus
2
¿Por qué hacerlo cada minuto? Como puede ver en la respuesta de @ newe1344, Heroku gira el banco de pruebas después de una hora de inactividad. Entonces, ¿seguramente anhelar cada 59 minutos es más eficiente?
Darwin Tech
2
Informa cuando está inactivo, por lo que la frecuencia de minutos funciona bien tanto para prevenir el sueño como para informar el tiempo de inactividad
Jesse Wolgamott
No creo que sea (¿todavía?) Gratis.
rahulserver
@rahulserver: tienes razón, Pingdom ya no tiene una cuenta gratuita.
John Lehmann
40

Respuesta fácil: si valora el servicio, pague por él.

Todos estos 'trucos' para obtener los beneficios del servicio pago ... bueno, es esencialmente como robar cable. Cuestionable incluso enumerarlos aquí. ¿Qué sigue, trucos sobre cómo piratear juegos?

Al igual que otro póster aquí, valoro el servicio gratuito para el desarrollo y las pruebas y me molestarán mucho todos los tipos con problemas de ética si Heroku lo elimina porque hay demasiados cargadores libres. Simplemente no creo que haya sido lo suficientemente directo en su crítica.

el C
fuente
14
Es un servicio pago, con ciertos términos. ¿Por qué no optimizar su uso del servicio dentro de esos términos para aprovecharlo al máximo?
pkinsky
8
Bueno, creo que ya indiqué la razón, pero para explicarlo un poco más: el uso previsto del alojamiento gratuito es claro. Y la ventaja de 'siempre activo' es una ventaja de pagar incluso la miseria de un segundo trabajador. Todos los exploits aquí implican consumir recursos inútilmente para evitar pagar un servicio. Es un comportamiento vergonzoso. ¿Por qué debería importarme? Porque si se cansan, su recurso será eliminar el servicio gratuito que, según lo previsto, es de gran valor para mí.
elc
2
De acuerdo, solo para aclararles a los votantes que conducen en el camino, él no solo pregunta "¿Hay alguna forma de evitarlo?" él también pregunta "¿Debería estar pagando ..."? Esto es lo que estoy respondiendo. Es la pregunta más fundamental. Claro que hay toneladas de formas trivialmente fáciles de evitar. Están éticamente equivocados, por lo que en el mejor de los casos es una pérdida de tiempo detallarlos aquí, y podría decirse que es considerablemente peor, ya que constituye un comportamiento favorable y alentador.
elc
44
Eso es un poco exagerado. Nos desplegamos en heroku durante las pruebas. Cuando nuestros clientes van al sitio cuando ha estado inactivo, suponen que hay algo mal con la aplicación que desarrollamos para conectarse al servicio. Mantener vivo el sitio en aras de la capacidad de respuesta a la demostración de una aplicación que nunca verá la luz del día no es poco ético. Suena como una convicción personal, no ética. Si no viola las reglas o la ley, su presunción ética es lo único que está mal . Freemium es un modelo comercial legítimo. Está bien "aprovechar" la parte gratuita de eso. Se espera
Matt Long
1
Entonces su justificación es "todos los demás lo están haciendo". Ese no es realmente un argumento nuevo. O una convincente. editar Lo siento, usted hace un punto que es válido para algunas personas. Que lo que se está haciendo no está explícitamente prohibido, por lo tanto, no está mal. Sé que hay personas que creen que "lo que no está expresamente prohibido está permitido" y van más allá al decir que no solo está permitido sino que "no está mal". Toda esa actitud es lo que yo llamaría extralimitarse de una manera muy egoísta. Pero se reduce a una diferencia filosófica fundamental.
elc
30

Probado y trabajando en mi propia aplicación Heroku usando Node.js 0.10.x el 28/06/2013

var http = require('http'); //importing http

function startKeepAlive() {
    setInterval(function() {
        var options = {
            host: 'your_app_name.herokuapp.com',
            port: 80,
            path: '/'
        };
        http.get(options, function(res) {
            res.on('data', function(chunk) {
                try {
                    // optional logging... disable after it's working
                    console.log("HEROKU RESPONSE: " + chunk);
                } catch (err) {
                    console.log(err.message);
                }
            });
        }).on('error', function(err) {
            console.log("Error: " + err.message);
        });
    }, 20 * 60 * 1000); // load every 20 minutes
}

startKeepAlive();
DubbyTT
fuente
2
En mi opinión, la mejor solución, ya que no depende de ningún servicio de terceros. Gracias :)
electronix384128
Parece que no evita ir a dormir. Pero funciona para volver a subir automáticamente. No sé si este comportamiento se debe a cambios, en realidad su solución proviene de hace casi dos años.
jgato
20

Utilizo el complemento Heroku Scheduler proporcionado por Heroku de forma gratuita. Una vez agregado, es simple como crear un trabajo con 'curl http://yourapp.herokuapp.com ' y un intervalo de 10 minutos.

Jordán
fuente
11

Dice en la documentación de Heroku que tener más de 1 dinamómetro web nunca estará inactivo. Posiblemente una solución más barata que $ 0.09 / hora como sugiere Pierre.

ingrese la descripción de la imagen aquí

Documentación

newshorts
fuente
66
El complemento Heroku tiene una versión estándar gratuita.
sscirrus
9

He escrito los pasos:

➜ Agregue la gema 'newrelic_rpm' a su Gemfile en etapas y producción
➜ instalación de paquete
➜ Inicie sesión en el panel de control de heroku y agregue el complemento newrelic
➜ Una vez agregado, configure el ping automático en su sitio web para que no esté inactivo
➜ Vaya a Menú> Monitoreo de disponibilidad ( en Configuración) → Haga clic en "Activar monitoreo de disponibilidad"
➜ Ingrese la url para hacer ping (por ejemplo: http://spokenvote.org )
➜ Seleccione 1 minuto para el intervalo

Pratik Khadloya
fuente
3
Gracias pratik Para su información, si hace ping a su aplicación cada minuto, usará el ancho de banda sin ningún beneficio al ralentí. A menos que tenga otra razón, es seguro reducir ese toque.
sscirrus
Gracias por la sugerencia @sscirrus
Pratik Khadloya
3
Heroku solo duerme su dinamómetro después de 1 hora de inactividad, por lo que puede volver a escalar el intervalo a 1 hora (o tal vez 50 minutos para estar seguro).
David Underwood
Pregunta: ¿Sabes dónde cambiar ese intervalo de ping? Parece que no es una opción disponible en la configuración del tablero.
mishap_n
4

Encontré otro sitio gratuito que constantemente hará ping a su sitio llamado Unidler

http://unidler.herokuapp.com/

Igual que pingdom, pero no necesita iniciar sesión.

sonnyhe2002
fuente
¿Cómo eliminar después de agregar?
Lekr0
3

Tenga en cuenta que los nuevos tipos de dinamómetro ( actualmente en beta , que llegarán en junio de 2015) prohibirán mantener un dinamómetro libre las 24 horas del día, los 7 días de la semana, ya que tendría que dormir al menos 6 horas por día.

Por lo tanto, intente eliminar cualquier solución que haya encontrado en este hilo antes de que salga a la luz (o pague por el servicio que realmente usa).

aymericbeaumet
fuente
3

Si tiene acceso a un servidor Unix que siempre está activo, puede configurar un trabajo cron en GETsu sitio web. Según los nuevos términos del plan gratuito, es probable que desee deshabilitar los GETs en las horas nocturnas, usando una línea en su crontab como esta:

*/20 8-22 * * * /usr/bin/curl domain.com &> /dev/null

Esto instruye curlaGET domain.com cada 20 minutos entre las horas de 8 y 22.

Sé consciente de

  1. No todos los que quieren ver su sitio web viven en su zona horaria y
  2. Su sitio puede recibir otras solicitudes en el medio de la noche, despertando su dinamómetro y causando otra hora de tiempo de uso para cada solicitud. Incluso si nadie más conoce tu dominio, hay robots y rastreadores que están activos todo el tiempo. Por lo tanto, es aconsejable configurar el proceso definido en su crontab para que esté activo durante solo 14 a 16 horas para proporcionar un búfer contra estas activaciones

Además, asegúrese de que la hora de su sistema esté configurada correctamente para que la ventana de tiempo de inactividad ocurra cuando lo espera.

drs
fuente
3

La mayoría de las respuestas aquí están desactualizadas o actualmente no funcionan. El nivel gratuito actual para cuentas personales es una base de 550 horas de dinamómetro gratis cada mes.

Y una cuenta gratuita verificada te da 1000 horas de dinamómetro gratis. Escribí un artículo sobre cómo hice que mi aplicación gratuita permaneciera despierta.

https://link.medium.com/uDHrk5HAD0

Espero que ayude a cualquiera que necesite una solución en 2019

Mahdhi Rezvi
fuente
2

esto funciona para mí en una aplicación de primavera que hace una solicitud http cada 2 minutos a la ruta de la URL raíz '

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.client.RestTemplate;

public class HerokuNotIdle {

private static final Logger LOG = LoggerFactory.getLogger(HerokuNotIdle.class);

@Scheduled(fixedDelay=120000)
public void herokuNotIdle(){
    LOG.debug("Heroku not idle execution");
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.getForObject("http://yourapp.herokuapp.com/", Object.class);
}
}

Recuerde configurar su contexto para habilitar el planificador y crear el bean para su planificador

@EnableScheduling
public class AppConfig {

@Bean
public HerokuNotIdle herokuNotIdle(){
    return new HerokuNotIdle();
}
}
zeta
fuente
2

Chico, aquí hay una aplicación heroku que puedes ejecutar para mantener vivas varias aplicaciones heroku. Simplemente agregue las URL que desea hacer ping en config.json.

https://github.com/jcarras/rise-and-shine

ReadyBird
fuente
1

Tengo una aplicación que solo necesita ejecutarse de lunes a viernes a la hora del almuerzo. Acabo de agregar el siguiente script al crontab en el trabajo:

#!/bin/sh
# script to unidle heroku installation for the use with cronjob
# usage in crontab:
# */5 11-15 * * 1-5 /usr/local/bin/uptimer.sh http://www.example.com
# The command /usr/local/bin/uptimer.sh http://www.example.com will execute every 5th minute of 11am through 3pm Mondays through Fridays in every month.
# resources: http://www.cronchecker.net
echo url to unidle: $1
echo [UPTIMER]: waking up at:
date
curl $1
echo [UPTIMER]: awake at:
date

Entonces, para cualquier aplicación, simplemente suelte otra línea en su crontab como:

*/5 11-15 * * 1-5 /usr/local/bin/uptimer.sh http://www.example.com
RedRoosterMobile
fuente
1

Creo que la solución más fácil para esto es hacer ping a su propio servidor cada 30 minutos. Aquí está el código que uso en mi proyecto node.js para evitar dormir.

const request = require('request');
const ping = () => request('https://<my-app-name>.herokuapp.com/', (error, response, body) => {
    console.log('error:', error); // Print the error if one occurred
    console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
    console.log('body:', body); // Print body of response received
});
setInterval(ping, 20*60*1000); // I have set to 20 mins interval
Rohan
fuente
1

Una solución más de trabajo: wokeDyno Aquí hay una publicación de blog sobre cómo funciona: está integrado en la aplicación de manera muy fácil:

/* Example: as used with an Express app */

const express = require("express")
const wakeDyno = require("woke-dyno");

// create an Express app
const app = express();

// start the server, then call wokeDyno(url).start()
app.listen(PORT, () => {
    wakeDyno(DYNO_URL).start(); // DYNO_URL should be the url of your Heroku app
});
skywinder
fuente