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

286

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

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

Donc, j'ai un problème: devrais-je payer 36 $ par mois pour économiser à chaque utilisateur une durée embarrassante de 20 secondes lorsque mon trafic est à un chiffre par jour.

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

sscirrus
la source
13
À partir du 1er juillet 2015, cela ne sera plus possible, selon l'annonce de Heroku: blog.heroku.com/archives/2015/5/7/heroku-free-dynos . Ils ont cependant introduit un plan "hobby" qui ne coûte que 7 $ / mois.
Cristian
1
Il y a maintenant peut-être des serveurs virtuels disponibles pour 5 $ / mois (ou moins facturés à l'heure) qui offrent un accès complet au shell, etc. IMO une meilleure solution si Heroku n'est plus gratuit ..
sricks
1
@sricks Un VPS complet (que vous devez gérer, maintenir à jour, configurer un serveur Git, un serveur Web, un serveur DB, un pare-feu, des crochets Git, des sauvegardes, WAL-E, etc., etc., etc.) est différent de Heroku ( un PaaS). Dans certains cas, vous voulez le premier, dans d'autres le second, mais les dollars bruts devraient être une mesure principale. Le temps et le risque devraient l'être.
elithrar
Comment installer l'agent New Relic sur l'application RoR? newrelic.com/ruby
Manny Quintanilla
1
Depuis le 1er juin 2016, cela est à nouveau possible si vous vérifiez avec une carte de crédit. annonce . Vous obtiendrez 1000 heures gratuites par mois, et il n'y a que 730 heures par mois. En supposant que vous n'avez qu'un seul dyno en cours d'exécution, vous pouvez aller 24/7 gratuitement.
Baked Potato

Réponses:

352

Vous pouvez installer le module complémentaire New Relic gratuit . Il dispose d'une fonction de surveillance de la disponibilité qui exécutera une commande ping sur votre site deux fois par minute, empêchant ainsi le dynamomètre de tourner au ralenti.

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

Suivi de disponibilité

Remarque: à tous ceux qui disent que cela ne fonctionne pas: la partie importante de ma réponse est "moniteur de disponibilité". Installer simplement l'addon n'aidera pas. Vous devez également configurer la surveillance de la disponibilité avec l'URL de votre application Heroku.

Pierre
la source
6
devons-nous également installer la gemme 'newrelic_rpm' pour empêcher le dyno de tourner au ralenti?
simo
3
De combien cela augmente-t-il l'utilisation du dynamo?
Trevoke
4
Je viens de le découvrir assez récemment. Cela fonctionne toujours très bien. Au cas où, cependant, je m'assure de faire une simple requête DB avant d'afficher un message «Application disponible». Cela fonctionne également très bien avec Pagoda et tout autre hôte endormi.
Jacob Evan Shreve
8
@aubraus: votre modification a été rejetée ... Quoi qu'il en soit: à tous ceux qui disent que cela ne fonctionne pas: la partie importante de ma réponse est "moniteur de disponibilité". Installer simplement l'addon n'aidera pas. Vous devez également configurer la surveillance de la disponibilité avec l'URL de votre application Heroku.
Pierre
13
Dans le cas où quelqu'un chercherait toujours cela, le lien direct pour le ping est ici: synthetics.newrelic.com/accounts/[your_account_id .
Eric Yang
91

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

MISE À JOUR du 7 mai 2015: Cela ne sera plus possible, car Heroku changera son dyno gratuit pour éviter de le garder en vie pendant 24 heures:

Un autre changement important concerne le sommeil dynamique ou la marche au ralenti. Alors que les applications non payantes ont toujours dormi après un délai d'activité, certaines applications ont utilisé des services de ping automatique pour éviter ce comportement. les dynos gratuits sont autorisés 18 heures éveillés par période de 24 heures, et au cours des prochaines semaines, nous commencerons à informer les utilisateurs des applications qui dépassent cette limite. Avec l'introduction du dyno hobby (7 $ par mois), nous vous demandons de laisser votre application dormir après la fin du délai, ou de passer à cette nouvelle option.

Quand est-ce que ça va être en direct? Selon leur article de blog:

Les applications exécutant un seul dyno 1X qui n'accumulent pas d'autres frais de dyno seront migrées progressivement vers les nouveaux dynos gratuits à partir du 1er juillet .

Cristian
la source
1
Uptimerobot semble être (ironiquement) en baisse. Vous pouvez vous inscrire et vous connecter, mais si vous essayez d'ajouter un nouveau moniteur, il est simplement dit "moniteur déjà
Jeff Axelrod
Semble fonctionner correctement, eh bien ... Je comprends que heroku dort des choses sur des services gratuits, mais il craint lors de l'hébergement d'un coordinateur central (qui par nature ne peut pas être mis à l'échelle).
jonasfj
Je n'ai pas pu le faire car Uptimerobot nécessite une adresse IP ?? Je ne vois pas comment le faire fonctionner avec une URL, comme une URL herokuapp. EDIT: Mon mauvais, je mettais dans http://et obtenir une erreur.
Ruben Martinez Jr.,
1
La grande différence est que les intervalles de 5 minutes signifient qu'il faudra 5 minutes avant que vous ne soyez averti en cas de panne. Nous utilisons Pingometer ( pingometer.com ) qui a des intervalles de 1 minute et c'est super avec Heroku.
okoboko
9
En avril 2017, la limite de 18 heures a disparu, vous pouvez avoir votre dynamo gratuit 24/7, à condition que votre compte soit vérifié. devcenter-staging.heroku.com/articles/free-dyno-hour-faq .
bagonyi
76

À 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.

Si rien d'autre, utilisez une tâche cron pour envoyer une requête ping à votre site et désactivez la vérification des périodes connues de faible utilisation (c'est-à-dire la nuit) pour vous assurer que Heroku ne supprime pas le niveau gratuit pour tout le monde.

drowe
la source
Merci pour votre réponse. Qu'entendez-vous spécifiquement par «réfléchissez bien à ce que vous faites»?
sscirrus
36
En grande partie pour les personnes qui ont lu les réponses ci-dessus pour cette solution. L'objectif du niveau gratuit sur Heroku n'est pas d'héberger une application de production qui doit être disponible pour les clients. Le ralenti de niveau gratuit permet à Heroku d'offrir ce niveau pour le développement / test, sans frais généraux élevés liés à des serveurs en fonctionnement constant.
drowe
29
C'est aussi bien pour un site "de production" à faible trafic et sans clients payants, que vous ne voulez pas attendre trente secondes pour que la première page se charge.
alxndr
2
Vous avez raison, mais il existe de nombreuses raisons valables pour exécuter un seul dynamo ... Comme avoir un seul coordinateur avec un état en mémoire ...
jonasfj
17
Vous ne savez pas grand-chose sur son application, donc je pense que votre commentaire est assez critique.
wobbily_col
60

Vous pouvez également essayer http://kaffeine.herokuapp.com (créé par mes soins), il est conçu pour empêcher les applications Heroku de s'endormir. Il exécutera une commande ping sur votre application toutes les 10 minutes afin que votre application ne se mette pas en veille. C'est totalement gratuit.

Romain
la source
1
est-il possible de supprimer votre herokuapp de votre service?
météore
2
Il n'accepte plus de nouvelles applications. Sa page GitHub contient plusieurs problèmes à ce sujet. Cette réponse peut maintenant être considérée comme obsolète.
nickolay.laptev
45

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

Jesse Wolgamott
la source
2
Difficile de décider entre les deux réponses! Au final, je suis allé avec Newrelic car j'y ai déjà un compte. Merci beaucoup pour cette excellente suggestion - elle a aussi résolu mon problème. :) +1.
sscirrus
2
Pourquoi le faire chaque minute? Comme vous pouvez le voir dans la réponse de @ newe1344, Heroku fait tourner le dynamomètre après une heure d'inactivité. Alors, sûrement, flirter toutes les 59 minutes est plus efficace?
Darwin Tech
2
Il signale quand il est en panne, donc la fréquence des minutes fonctionne bien pour prévenir le sommeil et signaler les temps d'arrêt
Jesse Wolgamott
Je ne pense pas que ce soit (encore?) Gratuit.
rahulserver
@rahulserver - Vous avez raison, Pingdom n'a plus de compte gratuit.
John Lehmann
40

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

Toutes ces «astuces» pour profiter des avantages d'un service payant ... eh bien, c'est essentiellement comme voler du câble. Discutable même de les énumérer ici. Quelle est la prochaine étape, comment 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 à éthique si Heroku le supprime car il y a trop de freeloaders. Je ne pense tout simplement pas qu'il ait été assez direct dans ses critiques.

elc
la source
14
C'est un service payant, avec certaines conditions. Pourquoi ne pas optimiser votre utilisation du service dans ces conditions pour en tirer le meilleur parti?
pkinsky
8
Eh bien, je crois que j'ai déjà indiqué la raison, mais pour l'expliquer un peu plus loin - l'utilisation prévue de l'hébergement gratuit est claire. Et l'avantage de «toujours allumé» est un avantage de ne payer que la bouchée de pain pour un deuxième travailleur. Tous les exploits ici impliquent de consommer inutilement des ressources pour éviter de payer pour un service. C'est un comportement honteux. Pourquoi devrais-je m'en soucier? Car s'ils en ont marre, leur recours sera de supprimer le service gratuit qui, utilisé comme prévu, est d'une grande valeur pour moi.
elc
2
D'accord, juste pour clarifier pour vous les downvoters en voiture, il ne demande pas seulement "Y a-t-il un moyen de contourner cela?" il demande aussi "Dois-je payer ..." C'est ce à quoi je réponds. C'est la question la plus fondamentale. Bien sûr, il existe des tonnes de moyens trivialement faciles à contourner. Ils ont tort sur le plan éthique, c'est donc au mieux une perte de temps pour les détailler ici, et sans doute considérablement pire car cela constitue un encouragement et un encouragement à un mauvais comportement.
elc
4
C'est un peu excessif. Nous déployons sur heroku pendant les tests. Lorsque nos clients se rendent sur le site alors qu'il est inactif, ils supposent qu'il y a un problème avec l'application que nous avons développée pour se connecter au service. Garder le site en vie dans un souci de réactivité pour faire la démonstration d'une application qui ne verra peut-être jamais la lumière du jour n'est guère contraire à l'éthique. Cela ressemble à une conviction personnelle, pas à l'éthique. Si cela ne viole pas les règles ou la loi, votre présomption éthique est la seule chose qui ne va pas . Le freemium est un modèle commercial légitime. C'est bien de "profiter" de la partie gratuite de cela. C'est attendu.
Matt Long
1
Votre justification est donc "tout le monde le fait". Ce n'est pas vraiment un nouvel argument. Ou convaincante. modifier Désolé, vous faites une remarque valable pour certaines personnes. Que ce qui est fait n'est pas explicitement interdit, donc ce n'est pas faux. Je sais qu'il y a des gens qui croient que «ce qui n'est pas expressément interdit est permis» et vont plus loin pour dire que ce n'est pas seulement permis mais «pas mal». Toute cette attitude est ce que je qualifierais de débordant d'une manière très égoïste. Mais cela se résume à une différence philosophique fondamentale.
elc
30

Testé et travaillant sur ma propre application Heroku à l'aide de Node.js 0.10.x le 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
la source
2
À mon avis, la meilleure solution, car elle ne repose sur aucun service tiers. Merci :)
electronix384128
Il semble que cela n'évite pas de s'endormir. Mais cela fonctionne pour remonter automatiquement. Je ne sais pas si ce comportement est dû à des changements, en fait votre solution vient d'il y a presque deux ans.
jgato
20

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

Jordan
la source
11

Il est dit dans la documentation Heroku qu'avoir plus d'un dyno web ne sera jamais inactif. Peut-être une solution moins chère que 0,09 $ / heure comme le suggère Pierre.

entrez la description de l'image ici

Documentation

newshorts
la source
6
Le module complémentaire Heroku a une version standard gratuite.
sscirrus
9

J'ai noté les étapes:

➜ Ajoutez la gem 'newrelic_rpm' à votre Gemfile sous staging & production
➜ bundle install
➜ Connectez-vous au panneau de contrôle heroku et ajoutez newrelic addon
➜ Une fois ajouté, configurez le ping automatique sur votre site Web pour qu'il ne reste pas inactif
➜ Naviguez vers Menu> Surveillance de la disponibilité ( sous Paramètres) → Cliquez sur «Activer la surveillance de la disponibilité»
➜ Entrez l'URL pour cingler (par exemple: http://spokenvote.org )
➜ Sélectionnez 1 minute pour l'intervalle

Pratik Khadloya
la source
3
Merci Pratik. Pour info si vous cinglez votre application à chaque minute, vous utiliserez la bande passante sans aucun avantage au ralenti. Sauf si vous avez une autre raison, il est prudent de redimensionner cette touche.
sscirrus
Merci pour la suggestion @sscirrus
Pratik Khadloya
3
Heroku ne mettra votre dyno en veille qu'après 1 heure d'inactivité, vous pouvez donc ramener l'intervalle à 1 heure (ou peut-être 50 minutes pour être prudent).
David Underwood
Question: Savez-vous par hasard où changer cet intervalle de ping? Il semble que ce ne soit pas une option disponible dans les paramètres du tableau de bord.
mishap_n
4

J'ai trouvé un autre site gratuit qui testera constamment votre site appelé Unidler

http://unidler.herokuapp.com/

Identique à pingdom, mais n'a pas besoin de se connecter.

sonnyhe2002
la source
Comment supprimer après l'ajout?
Lekr0
3

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

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

aymericbeaumet
la source
3

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

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

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

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 dynamo et entraînant une autre heure d'utilisation pour chaque demande. Même si personne d'autre ne connaît votre domaine, il existe des robots et des robots d'exploration qui sont toujours actifs. Par conséquent, il est conseillé de définir le processus défini dans votre crontab pour qu'il ne soit actif que de 14 à 16 heures pour fournir un tampon contre ces réveils

Assurez-vous également que l'heure de votre système est correctement configurée afin que la fenêtre d'indisponibilité se produise lorsque vous vous y attendez.

drs
la source
3

La plupart des réponses ici sont obsolètes ou ne fonctionnent pas actuellement. Le niveau gratuit actuel pour les comptes personnels donne une base de 550 heures de dyno gratuites chaque mois.

Et un compte gratuit vérifié vous donne 1000 heures de dyno gratuit. J'ai écrit un article sur la façon dont j'ai rendu mon application gratuite éveillée.

https://link.medium.com/uDHrk5HAD0

J'espère que cela aidera toute personne qui a besoin d'une solution en 2019

Mahdhi Rezvi
la source
2

ce travail pour moi dans une application de printemps faisant une requête http toutes les 2 minutes vers le chemin de l'URL racine `

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 pour votre planificateur

@EnableScheduling
public class AppConfig {

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

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

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

ReadyBird
la source
1

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 n'importe quelle application, déposez simplement une autre ligne dans votre crontab comme:

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

Je pense que la solution la plus simple est d'auto-exécuter votre propre serveur toutes les 30 minutes. Voici le code que j'utilise dans mon projet node.js pour éviter de 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
la source
1

Une autre solution de travail: wokeDyno Voici un article de blog sur la façon dont cela fonctionne: Il est intégré dans l'application très facilement:

/* 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
la source
1

Un travail cron fera l'affaire. Voir https://cron-job.org . C'est gratuit et fiable.

roshnet
la source