web-dev-qa-db-fra.com

Un moyen facile d'empêcher Heroku de tourner au ralenti?

Dans les applications gratuites Heroku, les dynos semblent rester au ralenti - mon application a un trafic très faible, mais il n’est pas non plus vraiment acceptable dans mon cas que mes utilisateurs doivent attendre plus de 20 secondes pour lancer un nouveau dyno.

Franchement, avec ce genre d’attente, beaucoup partiront avant même que la première page ne s’affiche.

Alors, j’ai un problème: devrais-je payer 36 dollars par mois pour économiser chaque utilisateur pendant 20 secondes embarrassantes lorsque mon trafic est à un chiffre par jour.

Y a-t-il un moyen de contourner ceci??

275
sscirrus

Vous pouvez installer le logiciel gratuit add-on New Relic . Il dispose d'une fonction de surveillance de la disponibilité qui envoie une requête ping à votre site deux fois par minute, empêchant ainsi le dyno de rester inactif.

Plus ou moins la même solution que Jesse mais peut-être plus intégrée à Heroku ... Et avec quelques avantages (le suivi des performances est tout simplement génial).

Availability monitoring

Remarque: à tous ceux qui disent que cela ne fonctionne pas: la partie importante de ma réponse est "moniteur de disponibilité". Juste installer l'addon ne va pas aider. Vous devez également configurer la surveillance de la disponibilité avec l'URL de votre application heroku.

348
Pierre

En guise d'alternative à Pingdom, je suggère d'essayer ptimerobot . Il est gratuit et offre une vérification du site à intervalles de 5 minutes. Cela fonctionne très bien pour moi.

UPDATE du 7 mai 2015: Cela ne sera plus possible, car Heroku changera son dyno gratuit pour ne pas le garder. vivant pendant 24 heures:

Un autre changement important concerne le sommeil dormant ou la "marche au ralenti". Tandis que les applications non payées ont toujours dormi après un délai d’activité, certaines applications ont utilisé des services de ping automatique pour empêcher ce comportement. Les dynos gratuits ont droit à 18 heures de veille par période de 24 heures et, au cours des prochaines semaines, nous commencerons à informer les utilisateurs des applications dépassant cette limite. Avec l'introduction du dyno hobby (7 $ par mois), nous demandons de laisser votre application dormir après une pause ou de passer à cette nouvelle option.

Quand est-ce que ça va être live? Selon leur blog:

Les applications exécutant un seul dyno 1X qui n’accumulent pas d’autres frais de dyno seront migrées progressivement vers le nouveau dynos gratuit à compter du à partir du 1 er juillet .

89
Cristian

À mon avis, l'utilisation du niveau "gratuit" du service ne devrait pas alimenter une application de production ou orientée client. Bien que les solutions ci-dessus fonctionnent contre le ralenti Dyno, réfléchissez bien à ce que vous faites.

Sinon, utilisez une tâche cron pour envoyer un ping à votre site et désactivez la vérification des périodes connues de faible utilisation (c.-à-d. Pendant la nuit) pour vous assurer que Heroku ne supprime pas le niveau gratuit pour tous les autres.

74
drowe

Vous pouvez également essayer http://kaffeine.herokuapp.com (créé par moi), il est conçu pour empêcher les applications Heroku de s'endormir. Elle envoie une requête ping à votre application toutes les 10 minutes pour qu'elle ne s'endorme pas. C'est totalement gratuit.

56
Romain

Vous pouvez utiliser http://pingdom.com/ pour vérifier votre application. Si cela est fait toutes les minutes environ, heroku ne ralentira pas votre application et n'aura pas besoin de tourner.

45
Jesse Wolgamott

Réponse facile - si vous appréciez le service, payez-le.

Toutes ces "astuces" pour obtenir les avantages d'un service payant… eh bien, c'est essentiellement comme voler un câble. Discutable de même les énumérer ici. Quelle est la suite, des astuces pour pirater des jeux?

Comme une autre affiche ici, j'apprécie le service gratuit de développement et de test et je serai très ennuyé par tous les types à facultés éthiques si Heroku les supprime parce qu'il y a trop de freeloaders. Je ne pense tout simplement pas qu'il était assez direct dans ses critiques.

37
elc

Testé et travaillant sur ma propre application Heroku en utilisant Node.js 0.10.x le 28/06/201

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();
28
DubbyTT

J'utilise l'addon Heroku Scheduler fourni par Heroku gratuitement. Une fois ajouté, il est simple de créer un travail avec 'curl http://yourapp.herokuapp.com ' et un intervalle de 10 minutes.

19
Jordan

Dans la documentation Heroku, il est indiqué qu’avoir plus d’un dyno Web ne restera jamais inactif. Peut-être une solution moins chère que 0,09 $/heure comme le suggère Pierre.

enter image description here

Documentation

10
newshorts

J'ai écrit les étapes:

Ajoutez la gem 'newrelic_rpm' à votre Gemfile dans les étapes de mise en scène et de production
➜ installation groupée
➜ Connectez-vous au panneau de contrôle de heroku et ajoutez un addon newrelic
➜ Une fois ajouté, configurez la commande ping sur votre site Web de sorte qu'il ne soit pas inactif.
➜ Accédez à Menu> Surveillance de la disponibilité (sous Paramètres) → Cliquez sur "Activer la surveillance de la disponibilité".
➜ Entrez l'URL à utiliser pour le ping (par exemple: http://spokenvote.org )
➜ Sélectionnez 1 minute pour l'intervalle

9
Pratik Khadloya

J'ai trouvé un autre site gratuit qui va constamment faire un ping sur votre site appelé Unidler

http://unidler.herokuapp.com/

Identique à pingdom, mais ne nécessite pas de connexion.

3
sonnyhe2002

Notez que les nouveaux types de dyno ( actuellement en version bêta , entrant en juin 2015) interdiront de garder un dyno gratuit éveillé 24h/24 et 7j/7, car il devrait dormir au moins 6 heures par jour.

Essayez donc de supprimer toute solution trouvée dans ce fil avant que cela ne soit disponible (ou payez pour le service que vous utilisez réellement).

3
aymericbeaumet

Si vous avez accès à un serveur Unix qui est toujours actif, vous pouvez définir un travail cron sur GET votre site Web. Selon les nouvelles conditions du plan gratuit, vous voudrez probablement désactiver le GETs pendant la nuit, en utilisant une ligne dans votre crontab comme ceci:

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

Cela indique à curl to GET domain.com toutes les 20 minutes entre 8 heures et 22 heures.

Soit conscient que

  1. Tous ceux qui veulent voir votre site Web ne vivent pas dans votre fuseau horaire et
  2. Votre site peut recevoir d’autres demandes au milieu de la nuit, réveillant votre dyno et causant une heure supplémentaire de temps d’utilisation pour chaque demande. Même si personne ne connaît votre domaine, il y a des robots et des robots qui sont actifs tout le temps. Par conséquent, il est conseillé de définir le processus défini dans votre crontab pour qu'il ne soit actif que pendant 14 à 16 heures afin de fournir une mémoire tampon contre ces réveils.

Assurez-vous également que votre heure système est correctement configurée pour que la fenêtre d'indisponibilité apparaisse à votre convenance.

3
drs

Guy, voici une application heroku que vous pouvez exécuter pour conserver plusieurs applications heroku en vie. Ajoutez simplement les URL que vous souhaitez utiliser dans le fichier config.json.

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

1
ReadyBird

ce travail pour moi dans une application de printemps faisant une demande http toutes les 2 minutes à la racine du chemin de lʻurl `

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);
}
}

N'oubliez pas de configurer votre contexte pour activer le planificateur et créer le bean de votre planificateur

@EnableScheduling
public class AppConfig {

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

J'ai une application qui ne doit fonctionner que du lundi au vendredi vers midi. Je viens d'ajouter le script suivant à la crontab au travail:

#!/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

Donc, pour toute application, déposez une autre ligne dans votre crontab comme:

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