Einfacher Weg, um Heroku im Leerlauf zu verhindern?


285

In den kostenlosen Heroku-Apps scheinen die Dynos im Leerlauf zu bleiben - meine App hat sehr wenig Verkehr, aber es ist auch in meinem Fall nicht wirklich akzeptabel, dass meine Benutzer mehr als 20 Sekunden warten müssen, um einen neuen Dyno hochzufahren.

Ehrlich gesagt, mit dieser Art von Wartezeit werden viele gehen, bevor die erste Seite überhaupt angezeigt wird.

Ich habe also ein Problem: Sollte ich 36 US-Dollar pro Monat zahlen, um jedem Benutzer peinlich lange 20 Sekunden zu ersparen, wenn mein Datenverkehr im einstelligen Bereich pro Tag liegt?

Gibt es einen Weg, um das zu umgehen?


13
Ab dem 1. Juli 2015 wird dies laut Herokus Ankündigung nicht mehr möglich sein: blog.heroku.com/archives/2015/5/7/heroku-free-dynos . Sie führten jedoch einen "Hobby" -Plan ein, der nur 7 US-Dollar pro Monat kostet.
Cristian

1
Es gibt jetzt möglicherweise virtuelle Server für 5 US-Dollar pro Monat (oder weniger pro Stunde), die vollen Shell-Zugriff usw. bieten. Ich benutze DigitalOcean seit über einem Jahr, bin mir aber sicher, dass es noch andere im Wettbewerb gibt. IMO eine bessere Lösung, wenn Heroku nicht mehr frei ist ..
sricks

1
@sricks Ein vollständiger VPS (den Sie verwalten, auf dem neuesten Stand halten, einen Git-Server, einen Webserver, einen DB-Server, eine Firewall, Git-Hooks, Backups, WAL-E usw. usw. usw. konfigurieren müssen) unterscheidet sich von Heroku ( ein PaaS). In einigen Fällen möchten Sie das erstere, in anderen das letztere, aber rohe Dollars sollten eine primäre Metrik sein. Zeit und Risiko sollten sein.
Elithrar

Wie installiere ich den New Relic-Agenten in der RoR-App? newrelic.com/ruby
Manny Quintanilla

1
Ab dem 1. Juni 2016 ist dies wieder möglich, wenn Sie mit einer Kreditkarte verifizieren. Ankündigung . Sie erhalten 1000 kostenlose Stunden pro Monat und es gibt nur 730 Stunden pro Monat. Angenommen, Sie haben nur einen Prüfstand, können Sie rund um die Uhr kostenlos fahren.
Ofenkartoffel

Antworten:


351

Sie können das kostenlose New Relic-Add-On installieren . Es verfügt über eine Verfügbarkeitsüberwachungsfunktion, die Ihre Site zweimal pro Minute anpingt und so verhindert, dass der Prüfstand im Leerlauf läuft.

Mehr oder weniger die gleiche Lösung wie Jesse, aber vielleicht stärker in Heroku integriert ... Und mit ein paar Vorteilen (Leistungsüberwachung ist einfach großartig).

Verfügbarkeitsüberwachung

Hinweis: Für alle, die sagen, dass es nicht funktioniert: Der wichtige Teil meiner Antwort ist "Verfügbarkeitsmonitor". Nur die Installation des Addons hilft nicht. Sie müssen auch die Verfügbarkeitsüberwachung mit der URL Ihrer Heroku-App einrichten.


6
Müssen wir auch das Gem 'newrelic_rpm' installieren, um zu verhindern, dass der Dyno im Leerlauf läuft?
Simo

3
Um wie viel erhöht dies die Dyno-Nutzung um?
Trevoke

4
Ich habe das erst vor kurzem entdeckt. Es funktioniert immer noch hervorragend. Nur für den Fall, dass ich eine einfache DB-Abfrage durchführe, bevor eine Meldung "Anwendung verfügbar" angezeigt wird. Dies funktioniert auch hervorragend mit der Pagode und jedem anderen schläfrigen Gastgeber.
Jacob Evan Shreve

8
@aubraus: Ihre Bearbeitung wurde abgelehnt ... Wie auch immer: an alle, die sagen, dass es nicht funktioniert: Der wichtige Teil meiner Antwort ist "Verfügbarkeitsmonitor". Nur die Installation des Addons hilft nicht. Sie müssen auch die Verfügbarkeitsüberwachung mit der URL Ihrer Heroku-App einrichten.
Pierre

13
Falls jemand noch danach sucht, ist der direkte Link für den Ping hier: synthetics.newrelic.com/accounts/[your_account_id‹/monitors/new Geben Sie einfach Ihre Konto-ID ein.
Eric Yang

91

Als Alternative zu Pingdom empfehle ich Uptimerobot . Es ist kostenlos und bietet 5 Minuten Intervall Site Checking. Es funktioniert sehr gut für mich.

UPDATE 7. Mai 2015: Dies wird nicht mehr möglich sein, da Heroku seinen kostenlosen Prüfstand ändert , um zu verhindern, dass er 24 Stunden lang am Leben bleibt :

Eine weitere wichtige Änderung betrifft das Dyno-Schlafen oder den Leerlauf. Während nicht bezahlte Apps nach einem Aktivitäts-Timeout immer geschlafen haben, verwendeten einige Apps automatische Ping-Dienste, um dieses Verhalten zu verhindern. Kostenlose Dynos dürfen 18 Stunden pro 24 Stunden wach sein. In den nächsten Wochen werden wir Benutzer über Apps informieren, die diese Grenze überschreiten. Mit der Einführung des Hobby-Prüfstands (7 US-Dollar pro Monat) möchten wir entweder Ihre App nach einer Auszeit schlafen lassen oder auf diese neue Option aktualisieren.

Wann wird das live sein? Laut ihrem Blog-Beitrag:

Anwendungen, auf denen ein einzelner 1X-Dyno ausgeführt wird und für die keine anderen Dyno-Gebühren anfallen, werden ab dem 1. Juli schrittweise auf die neuen kostenlosen Dynos migriert .


1
Uptimerobot scheint (ironischerweise) unten zu sein. Sie können sich anmelden und anmelden, aber wenn Sie versuchen, einen neuen Monitor hinzuzufügen, heißt es nur "Monitor bereits
Jeff Axelrod

Scheint fair zu funktionieren, na ja ... Ich verstehe, dass Heroku Dinge mit kostenlosen Diensten schläft, aber es ist scheiße, wenn ein zentraler Koordinator gehostet wird (was von Natur aus nicht skalierbar ist).
Jonasfj

Ich konnte dies nicht tun, da Uptimerobot eine IP-Adresse benötigt? Ich kann nicht sehen, wie ich es mit einer URL wie einer Herokuapp-URL zum Laufen bringen kann. EDIT: Mein schlechtes, ich habe das eingegeben http://und einen Fehler bekommen.
Ruben Martinez Jr.

1
Der große Unterschied besteht in 5-Minuten-Intervallen. Dies bedeutet, dass es 5 Minuten dauert, bis Sie benachrichtigt werden, wenn es nicht funktioniert. Wir verwenden Pingometer ( pingometer.com ), das Intervalle von 1 Minute hat und mit Heroku großartig war.
Okoboko

9
Ab April 2017 ist das 18-Stunden-Limit abgelaufen. Sie können Ihren kostenlosen Prüfstand rund um die Uhr nutzen, sofern Ihr Konto verifiziert ist. devcenter-staging.heroku.com/articles/free-dyno-hour-faq .
Bagonyi

76

Meiner Meinung nach sollte die Verwendung der "kostenlosen" Stufe des Dienstes keine Produktions- oder Kundenanwendung mit Strom versorgen. Während die oben genannten Lösungen gegen den Dyno-Leerlauf wirken, sollten Sie genau überlegen, was Sie tun.

Wenn nichts anderes, verwenden Sie einen Cron-Job, um Ihre Website zu pingen, und deaktivieren Sie die Überprüfung für bekannte Zeiträume mit geringer Nutzung (dh über Nacht), um sicherzustellen, dass Heroku die kostenlose Stufe nicht für alle anderen abschafft.


Danke für deine Antwort. Was meinen Sie konkret mit "gründlich überlegen, was Sie tun"?
sscirrus

36
Vor allem für Leute, die die obigen Antworten für diese Lösung lesen. Das Ziel der kostenlosen Stufe auf Heroku ist nicht, eine Produktions-App zu hosten, die für Kunden verfügbar sein muss. Dank des kostenlosen Leerlaufs kann Heroku diese Stufe für die Entwicklung / das Testen anbieten, ohne dass hohe Kosten für den ständigen Betrieb von Servern anfallen.
Drowe

29
Es ist auch in Ordnung für eine "Produktions" -Site mit wenig Verkehr und ohne zahlende Kunden, die nicht dreißig Sekunden warten möchten, bis die erste Seite geladen ist.
Alxndr

2
Sie haben Recht, aber es gibt viele triftige Gründe, nur einen
Prüfstand auszuführen

17
Sie wissen nicht viel über seine App, daher denke ich, dass Ihr Kommentar in Anbetracht dessen ziemlich wertend ist.
Wobbily_col

60

Sie können auch http://kaffeine.herokuapp.com (von mir erstellt) ausprobieren , um zu verhindern, dass Heroku-Apps einschlafen. Ihre App wird alle 10 Minuten gepingt, damit Ihre App nicht in den Ruhezustand wechselt. Es ist völlig kostenlos.


1
Ist es möglich, Ihre Herokuapp aus Ihrem Dienst zu entfernen?
Meteor

2
Es werden keine neuen Apps mehr akzeptiert. Die GitHub-Seite enthält einige Probleme dazu. Diese Antwort kann jetzt als veraltet angesehen werden.
nickolay.laptev

45

Sie können http://pingdom.com/ verwenden , um Ihre App zu überprüfen. Wenn dies jede Minute oder so erledigt wird, wird Heroku Ihre App nicht inaktivieren und muss nicht hochgefahren werden.


2
Es ist so schwer, sich zwischen den beiden Antworten zu entscheiden! Am Ende bin ich mit Newrelic gegangen, weil ich dort bereits einen Account habe. Vielen Dank für diesen tollen Vorschlag - er hat auch mein Problem gelöst. :) +1.
sscirrus

2
Warum jede Minute? Wie Sie in der Antwort von @ newe1344 sehen können, dreht Heroku nach einer Stunde Inaktivität den Prüfstand herunter. Ist es also effizienter, alle 59 Minuten zu sehnen?
Darwin Tech

2
Es meldet, wenn es unten ist, so dass die
Minutenfrequenz

Ich denke nicht, dass es (noch?) Kostenlos ist.
Rahulserver

@rahulserver - Sie haben Recht, Pingdom hat kein kostenloses Konto mehr.
John Lehmann

40

Einfache Antwort - wenn Sie den Service schätzen, zahlen Sie dafür.

All diese "Tricks", um die Vorteile eines kostenpflichtigen Dienstes zu nutzen ... nun, es ist im Wesentlichen wie das Stehlen von Kabeln. Fraglich, sie hier überhaupt aufzulisten. Was kommt als nächstes, Tricks, wie man Spiele raubkopiert?

Wie ein anderes Poster hier schätze ich den kostenlosen Service für Entwicklung und Test und ich werde mich sehr über alle ethisch beeinträchtigten Typen ärgern, wenn Heroku ihn abschafft, weil es zu viele Freeloader gibt. Ich glaube einfach nicht, dass er in seiner Kritik direkt genug war.


14
Es ist ein kostenpflichtiger Service mit bestimmten Bedingungen. Warum optimieren Sie nicht Ihre Nutzung des Dienstes innerhalb dieser Bedingungen, um das Beste aus ihm herauszuholen?
Pkinsky

8
Nun, ich glaube, ich habe bereits den Grund angegeben, aber um es etwas weiter zu formulieren - die beabsichtigte Verwendung des kostenlosen Hostings ist klar. Und der Vorteil von "immer an" ist der Vorteil, dass nur ein Cent für einen zweiten Arbeiter gezahlt wird. Bei allen Exploits werden unnötig Ressourcen verbraucht, um nicht mehr für einen Service bezahlen zu müssen. Es ist beschämendes Verhalten. Warum sollte es mich kümmern? Denn wenn sie die Nase voll haben, müssen sie auf den kostenlosen Service verzichten, der für mich von großem Wert ist.
Elc

2
Okay, nur um Ihnen die vorbeifahrenden Downvoter zu verdeutlichen, fragt er nicht nur: "Gibt es einen Weg, das zu umgehen?" er fragt auch "Soll ich bezahlen ..." Dies ist, was ich antworte. Es ist die grundlegendere Frage. Sicher gibt es unzählige einfach zu umgehende Möglichkeiten. Sie sind ethisch falsch, daher ist es bestenfalls Zeitverschwendung, sie hier detailliert zu beschreiben, und es ist wohl erheblich schlimmer, da sie schlechtes Verhalten ermöglichen und fördern.
Elc

4
Das ist ein bisschen übertrieben. Wir setzen Heroku während des Testens ein. Wenn unsere Kunden die Website im Leerlauf besuchen, gehen sie davon aus, dass mit der App, die wir für die Verbindung mit dem Dienst entwickelt haben, etwas nicht stimmt. Es ist kaum unethisch, die Website am Leben zu erhalten, um auf eine Demo zu reagieren, die möglicherweise nie das Licht der Welt erblickt. Klingt nach einer persönlichen Überzeugung, nicht nach Ethik. Wenn es nicht gegen die Regeln oder das Gesetz verstößt, ist Ihre ethische Vermutung das einzige, was falsch ist . Freemium ist ein legitimes Geschäftsmodell. Es ist in Ordnung, den freien Teil davon "auszunutzen". Es wird erwartet.
Matt Long

1
Ihre Rechtfertigung lautet also "Alle anderen tun es". Das ist kein wirklich neues Argument. Oder eine überzeugende. edit Entschuldigung, Sie machen einen Punkt, der für einige Leute gültig ist. Das, was getan wird, ist nicht ausdrücklich verboten, daher ist es nicht falsch. Ich weiß, dass es Menschen gibt, die glauben, "was nicht ausdrücklich verboten ist, ist erlaubt" und weiter gehen, um zu sagen, dass es nicht nur erlaubt, sondern "nicht falsch" ist. Diese ganze Einstellung würde ich als Überreichweite auf sehr eigennützige Weise bezeichnen. Aber es kommt auf einen fundamentalen philosophischen Unterschied an.
Elc

30

Getestet und an meiner eigenen Heroku-App mit Node.js 0.10.x am 28.06.2013 gearbeitet

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

2
Meiner Meinung nach die beste Lösung, da sie nicht auf Dienste Dritter angewiesen ist. Danke :)
Electronix384128

Es scheint nicht zu vermeiden, schlafen zu gehen. Aber es funktioniert, um automatisch wieder hochzugehen. Ich weiß nicht, ob dieses Verhalten auf Änderungen zurückzuführen ist, tatsächlich stammt Ihre Lösung von vor fast zwei Jahren.
jgato

20

Ich benutze das von Heroku bereitgestellte Heroku Scheduler Addon kostenlos. Nach dem Hinzufügen ist es einfach, einen Job mit 'curl http://yourapp.herokuapp.com ' und einem Intervall von 10 Minuten zu erstellen .


11

In der Heroku-Dokumentation heißt es, dass mehr als ein Web-Dyno niemals im Leerlauf sein wird. Möglicherweise eine billigere Lösung als 0,09 USD / Stunde, wie Pierre vorschlägt.

Geben Sie hier die Bildbeschreibung ein

Dokumentation


6
Das Heroku-Add-On verfügt über eine kostenlose Standardversion.
sscirrus

9

Ich habe die Schritte aufgeschrieben:

➜ gem ‚newrelic_rpm‘ auf Ihrem Gemfile unter Staging & Produktion hinzufügen
➜ Bundle installieren
➜ Login Heroku Bedienfeld und fügen newrelic Addon
➜ Nach dem Hinzufügen Setup automatische Pingen auf Ihre Website , so dass es nicht untätig tut
➜ Wechseln Sie zu Menü> Verfügbarkeitsüberwachung ( unter Einstellungen) → Klicken Sie auf „Verfügbarkeitsüberwachung
aktivieren “. ➜ Geben Sie die zu pingende URL ein (z. B. http://spokenvote.org ).
➜ Wählen Sie 1 Minute für das Intervall


3
Danke Pratik. Zu Ihrer Information: Wenn Sie Ihre App jede Minute anpingen, verbrauchen Sie Bandbreite, ohne den Leerlauf zu beeinträchtigen. Es sei denn, Sie haben einen anderen Grund, es ist sicher, diese eine Berührung zurückzusetzen.
sscirrus

Vielen Dank für den Vorschlag @sscirrus
Pratik Khadloya

3
Heroku versetzt Ihren Prüfstand erst nach 1 Stunde Inaktivität in den Schlaf, sodass Sie das Intervall auf 1 Stunde (oder vielleicht 50 Minuten, um auf der sicheren Seite zu sein) reduzieren können.
David Underwood

Frage: Wissen Sie zufällig, wo Sie dieses Ping-Intervall ändern müssen? Es scheint keine verfügbare Option in den Dashboard-Einstellungen zu sein.
Missgeschick_n


3

Beachten Sie, dass die neuen Dyno-Typen ( derzeit in der Beta- Version, im Juni 2015 verfügbar) es verbieten, einen kostenlosen Dyno rund um die Uhr wach zu halten, da er mindestens 6 Stunden pro Tag schlafen müsste.

Versuchen Sie also, alle in diesem Thread gefundenen Lösungen zu entfernen, bevor diese veröffentlicht werden (oder zahlen Sie für den Dienst, den Sie tatsächlich nutzen).


3

Wenn Sie Zugriff auf einen Unix-Server haben, der immer aktiv ist, können Sie einen Cron-Job für GETIhre Website festlegen . Unter den neuen Bedingungen des kostenlosen Plans möchten Sie das GETs wahrscheinlich in den Nachtstunden deaktivieren , indem Sie eine Zeile in Ihrer Crontab wie folgt verwenden:

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

Dies weist alle 20 Minuten zwischen 8 und 22 Uhr curlan GETdomain.com.

Beachten Sie, dass

  1. Nicht jeder, der Ihre Website sehen möchte, lebt in Ihrer Zeitzone und
  2. Ihre Site erhält möglicherweise mitten in der Nacht andere Anfragen, die Ihren Prüfstand aufwecken und für jede Anfrage eine weitere Stunde Nutzungszeit verursachen. Auch wenn niemand Ihre Domain kennt, gibt es Bots und Crawler, die ständig aktiv sind. Daher ist es ratsam, den in Ihrer Crontab definierten Prozess so einzustellen, dass er nur 14 bis 16 Stunden lang aktiv ist, um einen Puffer gegen diese Aufweckvorgänge bereitzustellen

Stellen Sie außerdem sicher, dass Ihre Systemzeit ordnungsgemäß eingerichtet ist, damit das Ausfallzeitfenster angezeigt wird, wenn Sie dies erwarten.


3

Die meisten Antworten hier sind veraltet oder funktionieren derzeit nicht. Die derzeitige kostenlose Stufe für persönliche Konten bietet eine Basis von 550 kostenlosen Prüfstandsstunden pro Monat.

Mit einem verifizierten kostenlosen Konto erhalten Sie 1000 Stunden kostenlosen Prüfstand. Ich habe einen Artikel darüber geschrieben, wie ich meine kostenlose App wach gehalten habe.

https://link.medium.com/uDHrk5HAD0

Hoffe, es hilft jedem, der 2019 eine Lösung braucht


2

Diese Arbeit funktioniert für mich in einer Frühlingsanwendung, die alle 2 Minuten eine http-Anfrage an den Root-URL-Pfad sendet

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

Denken Sie daran, Ihren Kontext so zu konfigurieren, dass der Scheduler aktiviert und die Bean für Ihren Scheduler erstellt wird

@EnableScheduling
public class AppConfig {

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


1

Ich habe eine App, die nur von Montag bis Freitag gegen Mittag laufen muss. Ich habe gerade das folgende Skript zur Crontab bei der Arbeit hinzugefügt:

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

Fügen Sie für jede App einfach eine weitere Zeile in Ihre Crontab ein:

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

1

Ich denke, die einfachste Lösung besteht darin, alle 30 Minuten einen eigenen Ping an Ihren eigenen Server zu senden. Hier ist der Code, den ich in meinem node.js-Projekt verwende, um das Schlafen zu verhindern.

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

1

Eine weitere funktionierende Lösung: wokeDyno Hier ist ein Blog-Beitrag, wie es funktioniert: Es ist sehr einfach in die App integriert:

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.