Łatwy sposób na zapobieganie bezczynności Heroku?

285

W darmowych aplikacjach Heroku wydaje się, że dynos nadal pracuje na biegu jałowym - moja aplikacja ma bardzo mały ruch, ale w moim przypadku nie jest również do przyjęcia, że ​​moi użytkownicy muszą czekać ponad 20 sekund na uruchomienie nowej hamowni.

Szczerze mówiąc, przy takim czekaniu wielu odejdzie, zanim pierwsza strona się wyświetli.

Mam więc problem: czy powinienem płacić 36 USD miesięcznie, aby zaoszczędzić każdemu użytkownikowi żenująco długich 20 sekund, gdy mój ruch jest jednocyfrowy dziennie.

Czy jest na to jakiś sposób?

sscirrus
źródło
13
Od 1 lipca 2015 r. Nie będzie to już możliwe, zgodnie z zapowiedzią Heroku : blog.heroku.com/archives/2015/5/7/heroku-free-dynos . Wprowadzili jednak plan „hobby”, który kosztuje tylko 7 USD / miesiąc.
Cristian
1
Obecnie mogą być dostępne wirtualne serwery za 5 USD / miesiąc (lub mniej za godzinę), które zapewniają pełny dostęp do powłoki itp. Korzystam z DigitalOcean od ponad roku, ale jestem pewien, że są inni, którzy mogą konkurować. IMO lepsze rozwiązanie, jeśli Heroku nie jest już wolne ..
sricks
1
@sricks Pełny VPS (którym musisz zarządzać, aktualizować, konfigurować serwer Git, serwer WWW, serwer DB, zaporę ogniową, haki Git, kopie zapasowe, WAL-E itp. itd. itp.) to coś innego niż Heroku ( PaaS). W niektórych przypadkach chcesz tego pierwszego, w innych drugiego, ale surowe dolary powinny być podstawową miarą. Czas i ryzyko powinny być.
elithrar
Jak zainstalować agenta New Relic w aplikacji RoR? newrelic.com/ruby
Manny Quintanilla
1
Od 1 czerwca 2016 r. Jest to znowu możliwe, jeśli zweryfikujesz za pomocą karty kredytowej. ogłoszenie . Otrzymasz 1000 bezpłatnych godzin miesięcznie, a miesięcznie jest tylko 730 godzin. Zakładając, że masz tylko jedną hamownię, możesz iść 24/7 za darmo.
Pieczony Ziemniak

Odpowiedzi:

351

Możesz zainstalować bezpłatny dodatek New Relic . Posiada funkcję monitorowania dostępności, która wysyła polecenie ping do Twojej witryny dwa razy na minutę, zapobiegając w ten sposób hamowaniu dynamiki.

Mniej więcej takie samo rozwiązanie jak Jesse, ale może bardziej zintegrowane z Heroku ... I z kilkoma dodatkami (monitorowanie wydajności jest po prostu świetne).

Monitorowanie dostępności

Uwaga: dla wszystkich, którzy mówią, że to nie działa: ważną częścią mojej odpowiedzi jest „monitor dostępności”. Samo zainstalowanie dodatku nie pomoże. Musisz także skonfigurować monitorowanie dostępności za pomocą adresu URL aplikacji heroku.

Pierre
źródło
6
czy musimy również zainstalować klejnot „newrelic_rpm”, aby uniemożliwić pracę silnika na biegu jałowym?
simo
3
O ile to zwiększa zużycie dyno?
Trevoke
4
Właśnie odkryłem to dość niedawno. To ma nadal działać doskonale. Na wszelki wypadek upewniam się, że wykonuję proste zapytanie DB przed wyświetleniem komunikatu „Dostępna aplikacja”. Działa to również świetnie z Pagoda i każdym innym śpiącym gospodarzem.
Jacob Evan Shreve
8
@ubraus: twoja edycja została odrzucona ... W każdym razie: dla wszystkich, którzy mówią, że to nie działa: ważną częścią mojej odpowiedzi jest „monitor dostępności”. Samo zainstalowanie dodatku nie pomoże. Musisz także skonfigurować monitorowanie dostępności za pomocą adresu URL aplikacji heroku.
Pierre
13
Jeśli ktoś nadal tego szuka, bezpośredni link do polecenia ping znajduje się tutaj: synthetics.newrelic.com/accounts/[your_account_id]/monitors/new Wystarczy wpisać identyfikator konta.
Eric Yang
91

Jako alternatywę dla Pingdom sugeruję wypróbowanie Uptimerobot . Jest bezpłatny i oferuje 5-minutowy interwał sprawdzania witryny. Działa dla mnie bardzo dobrze.

AKTUALIZACJA 7 maja 2015: Nie będzie to już możliwe, ponieważ Heroku zmieni swoje bezpłatne hamowanie, aby zapobiec utrzymywaniu go przez pełne 24 godziny:

Kolejna ważna zmiana dotyczy spania przez dno lub „pracy na biegu jałowym”. Chociaż aplikacje nieopłacane zawsze spały po upływie limitu czasu aktywności, niektóre aplikacje korzystały z usług automatycznego pingowania, aby temu zapobiec. bezpłatne dynos są dozwolone przez 18 godzin w trybie czuwania na okres 24 godzin, aw ciągu następnych kilku tygodni zaczniemy powiadamiać użytkowników o aplikacjach, które przekroczą ten limit. Wraz z wprowadzeniem hobby dyno (7 USD miesięcznie) prosimy o pozwolenie aplikacji na spanie po pewnym czasie lub uaktualnienie do tej nowej opcji.

Kiedy to będzie na żywo? Zgodnie z ich postem na blogu:

Aplikacje z uruchomionym pojedynczym hamowaniem 1X, które nie akumulują żadnych innych obciążeń, będą stopniowo migrowane do nowych darmowych dynos od 1 lipca .

Cristian
źródło
1
Uptimerobot wydaje się (jak na ironię) w dół. Możesz się zarejestrować i zalogować, ale jeśli spróbujesz dodać nowy monitor, powiesz tylko: „monitoruj już
Jeff Axelrod,
Wygląda na to, że działa uczciwie, no cóż ... Rozumiem, że heroku śpi w darmowych usługach, ale jest do bani, gdy gospodarzem jest główny koordynator (którego z natury nie można skalować).
jonasfj
Nie byłem w stanie tego zrobić, ponieważ Uptimerobot wymaga adresu IP? Nie widzę, jak to zrobić, aby działało z adresem URL, takim jak adres URL herokuapp. EDYCJA: Mój zły, wkładałem http://i dostaję błąd.
Ruben Martinez Jr.,
1
Duża różnica to 5-minutowe interwały, co oznacza, że ​​minie 5 minut, zanim otrzymasz powiadomienie, jeśli nie działa. Korzystamy z Pingometru ( pingometer.com ), który ma 1-minutowe interwały i jest świetny z Heroku.
okoboko,
9
W kwietniu 2017 r. Minął limit 18 godzin, możesz mieć bezpłatne hamowanie w trybie 24/7, pod warunkiem, że Twoje konto jest zweryfikowane. devcenter-staging.heroku.com/articles/free-dyno-hour-faq .
bagonyi
76

Moim zdaniem korzystanie z „bezpłatnej” warstwy usługi nie powinno zasilać aplikacji produkcyjnej ani aplikacji skierowanej do klienta. Podczas gdy powyższe rozwiązania działają na biegu jałowym Dyno, zastanów się dokładnie nad tym, co robisz.

Jeśli nic więcej, użyj polecenia cron do pingowania witryny i wyłącz sprawdzanie znanych okresów niskiego zużycia (tj. Z dnia na dzień), aby upewnić się, że Heroku nie rezygnuje z bezpłatnej warstwy dla wszystkich innych.

drowe
źródło
Dziękuję za odpowiedź. Co konkretnie rozumiesz przez „dokładne przemyślenie tego, co robisz”?
sscirrus
36
Głównie dla osób, które przeczytały powyższe odpowiedzi na to rozwiązanie. Celem darmowego poziomu w Heroku nie jest hostowanie aplikacji produkcyjnej, która musi być dostępna dla klientów. Bezpłatny poziom bezczynności pozwala Heroku oferować ten poziom do programowania / testowania, bez dużych kosztów stałych związanych z utrzymywaniem serwerów.
drowe
29
Jest także w porządku w przypadku witryny „produkcyjnej” o niskim natężeniu ruchu i bez płacących klientów, której nie chcesz czekać trzydzieści sekund na załadowanie pierwszej strony.
alxndr
2
Masz rację, ale istnieje wiele ważnych powodów, dla których wystarczyło uruchomić tylko jedną dyno ... Takich jak posiadanie jednego koordynatora z jakimś stanem w pamięci ...
jonasfj
17
Nie wiesz zbyt wiele o jego aplikacji, więc uważam, że twój komentarz jest dość rozważny.
wobbily_col
60

Możesz także wypróbować http://kaffeine.herokuapp.com (stworzone przeze mnie), służy ono do zapobiegania zasypianiu aplikacji Heroku. Pinguje twoją aplikację co 10 minut, więc nie będzie spać. Jest całkowicie darmowy.

Romain
źródło
1
czy można usunąć swoją herokuapp z usługi?
meteor
2
Nie akceptuje już nowych aplikacji. Strona GitHub zawiera kilka problemów na ten temat. Ta odpowiedź może być teraz uznana za przestarzałą.
nickolay.laptev
45

Możesz użyć http://pingdom.com/, aby sprawdzić swoją aplikację; jeśli będzie to wykonywane co minutę, Heroku nie będzie bezczynnie Twojej aplikacji i nie będzie potrzeby jej uruchamiania.

Jesse Wolgamott
źródło
2
Tak trudno wybrać między dwiema odpowiedziami! W końcu poszedłem z Newrelic, ponieważ mam już tam konto. Wielkie dzięki za tę wspaniałą sugestię - faktycznie rozwiązała również mój problem. :) +1.
sscirrus 30.03.11
2
Dlaczego robisz to co minutę? Jak widać w odpowiedzi @ newe1344, Heroku po godzinie bezczynności obraca dyno. Więc na pewno przeskakiwanie co 59 minut jest bardziej skuteczne?
Darwin Tech,
2
Zgłasza,
Nie sądzę, że jest (wciąż?) Darmowy.
rahulserver
@rahulserver - Masz rację, Pingdom nie ma już darmowego konta.
John Lehmann,
40

Łatwa odpowiedź - jeśli cenisz usługę, zapłać za nią.

Wszystkie te „sztuczki”, aby uzyskać korzyści z płatnej usługi ... to w zasadzie kradzież kabla. Wątpliwe, aby wymienić je tutaj. Co dalej, triki na temat piractwa gier?

Podobnie jak inny plakat tutaj, cenię bezpłatną usługę opracowywania i testowania i będę bardzo zirytowany wszystkimi typami osób z upośledzeniem etycznym, jeśli Heroku zniesie to, ponieważ jest zbyt wielu freeloaderów. Po prostu nie sądzę, żeby był wystarczająco bezpośredni w swojej krytyce.

elc
źródło
14
Jest to usługa płatna, z pewnymi warunkami. Dlaczego nie zoptymalizować korzystania z usługi na tych warunkach, aby jak najlepiej z niej skorzystać?
pkinsky
8
Cóż, uważam, że już wskazałem powód, ale sprecyzując to nieco dalej - zamierzone wykorzystanie darmowego hostingu jest jasne. Zaletą „zawsze włączonego” jest przywilej płacenia nawet grosza za drugiego pracownika. Wszystkie exploity tutaj wykorzystują niepotrzebnie zużywające się zasoby, aby uniknąć płacenia za usługę. To jest haniebne zachowanie. Dlaczego miałoby mnie to obchodzić? Ponieważ jeśli mają już dość, skorzystają z bezpłatnej usługi, która, zgodnie z przeznaczeniem, ma dla mnie wielką wartość.
elc
2
Okej, żeby wyjaśnić ci, którzy jadą z miejsca downvoters, nie tylko pyta: „Czy można to obejść?” pyta również: „Czy powinienem płacić ...” To właśnie odpowiadam. To jest bardziej podstawowe pytanie. Na pewno istnieje mnóstwo łatwych do obejścia sposobów. Są etycznie niepoprawne, więc w najlepszym wypadku strata czasu na ich opisanie tutaj, a prawdopodobnie znacznie gorsze, ponieważ stanowi zachęcanie i zachęcanie do złego zachowania.
elc
4
To trochę przesada. Podczas testowania wdrażamy do heroku. Kiedy nasi klienci odwiedzają witrynę, gdy jest bezczynna, zakładają, że coś jest nie tak z aplikacją, którą opracowaliśmy w celu połączenia z usługą. Utrzymanie strony przy życiu w celu szybkiego uruchomienia aplikacji, która może nigdy nie ujrzeć światła dziennego, nie jest wcale nieetyczne. Brzmi jak osobiste przekonanie, a nie etyka. Jeśli nie narusza to zasad ani prawa, twoje domniemanie etyczne jest jedyną rzeczą, która jest błędna . Freemium to legalny model biznesowy. Można „skorzystać” z darmowej części tego. Jest oczekiwany
Matt Long
1
Twoje uzasadnienie brzmi: „wszyscy to robią”. To nie jest tak naprawdę nowy argument. Lub przekonujący. edytuj Przykro nam, że robisz punkt, który jest ważny dla niektórych osób. To, co się robi, nie jest wyraźnie zabronione, więc nie jest złe. Wiem, że są ludzie, którzy uważają, że „to, co nie jest wyraźnie zabronione, jest dozwolone”, i kontynuują stwierdzenie, że jest to nie tylko dozwolone, ale „nie jest złe”. Całe to podejście nazwałbym przesadnym w bardzo służący sobie sposób. Ale sprowadza się to do fundamentalnej różnicy filozoficznej.
elc
30

Przetestowano i pracuję nad własną aplikacją Heroku za pomocą Node.js 0.10.x 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
źródło
2
Moim zdaniem najlepsze rozwiązanie, ponieważ nie opiera się na usługach stron trzecich. Dzięki :)
electronix384128,
Wydaje się, że nie da się uniknąć zaśnięcia. Ale działa automatycznie, aby ponownie przejść w górę. Nie wiem, czy to zachowanie jest spowodowane zmianami, tak naprawdę twoje rozwiązanie pochodzi prawie dwa lata temu.
jgato
20

Korzystam z dodatku Heroku Scheduler dostarczonego przez Heroku za darmo. Po dodaniu jest to proste, jak utworzenie pracy z „curl http://yourapp.herokuapp.com ” i 10-minutową przerwą.

Jordania
źródło
11

W dokumentacji Heroku napisano, że posiadanie więcej niż 1 sieciowej dynamiki nigdy się nie wyłączy. Prawdopodobnie tańsze rozwiązanie niż 0,09 USD za godzinę, jak sugeruje Pierre.

wprowadź opis zdjęcia tutaj

Dokumentacja

newshorts
źródło
6
Dodatek Heroku ma darmową wersję standardową.
sscirrus
9

Zapisałem kroki:

➜ Dodaj klejnot „newrelic_rpm” do Gemfile podczas inscenizacji i produkcji
➜ Zainstaluj pakiet
➜ Zaloguj się do panelu sterowania heroku i dodaj nowy dodatek
➜ Po dodaniu skonfiguruj automatyczne pingowanie do swojej witryny, aby nie pozostawało bezczynne
➜ Przejdź do Menu> Monitorowanie dostępności ( w Ustawieniach) → Kliknij „Włącz monitorowanie dostępności”
➜ Wprowadź adres URL do pingowania (np .: http://spokenvote.org )
➜ Wybierz 1 minutę interwału

Pratik Khadloya
źródło
3
Dzięki Pratik. Do sprawdzenia, jeśli co chwilę pingujesz aplikację, będziesz korzystać z przepustowości bez żadnych korzyści na biegu jałowym. Chyba że masz inny powód, że skalowanie jest bezpieczne.
sscirrus
Dzięki za sugestię @sscirrus
Pratik Khadloya
3
Heroku położy dynę na sen dopiero po 1 godzinie bezczynności, dzięki czemu możesz skrócić interwał z powrotem do 1 godziny (lub może 50 minut, aby być po bezpiecznej stronie).
David Underwood,
Pytanie: Czy wiesz, gdzie zmienić interwał ping? Wygląda na to, że nie jest dostępna w ustawieniach deski rozdzielczej.
mishap_n
4

Znalazłem inną darmową witrynę, która będzie stale pingować Twoją witrynę o nazwie Unidler

http://unidler.herokuapp.com/

To samo co pingdom, ale nie trzeba się logować.

sonnyhe2002
źródło
Jak usunąć po dodaniu?
Lekr0
3

Pamiętaj, że nowe typy dynów ( obecnie w fazie beta , dostępne w czerwcu 2015 r.) Zabraniają utrzymywania bezpłatnej dyniny przez 24 godziny na dobę, ponieważ musiałaby spać co najmniej 6 godzin dziennie.

Dlatego spróbuj usunąć wszelkie rozwiązania znalezione w tym wątku, zanim to wyjdzie (lub zapłać za faktycznie używaną usługę).

aymericbeaumet
źródło
3

Jeśli masz dostęp do zawsze działającego serwera unix, możesz ustawić zadanie cron dla GETswojej witryny. Zgodnie z nowymi warunkami bezpłatnego abonamentu prawdopodobnie zechcesz wyłączyć GETs w nocy, używając linii w swoim crontabie w następujący sposób:

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

To polecenie curldo GETdomain.com co 20 minut pomiędzy godziną 8 a 22.

Miej świadomość, że

  1. Nie każdy, kto chce zobaczyć Twoją witrynę, mieszka w Twojej strefie czasowej i
  2. Twoja witryna może odbierać inne żądania w środku nocy, budząc twoją hamownię i powodując kolejną godzinę użytkowania każdego żądania. Nawet jeśli nikt inny nie zna Twojej domeny, przez cały czas aktywne są roboty i roboty. Dlatego wskazane jest, aby ustawić proces zdefiniowany w twoim crontabie tak, aby był aktywny tylko przez 14 do 16 godzin, aby zapewnić bufor dla tych wybudzeń

Upewnij się również, że czas systemowy jest odpowiednio skonfigurowany, aby okno przestoju miało miejsce wtedy, gdy tego oczekujesz.

dr
źródło
3

Większość odpowiedzi tutaj jest nieaktualna lub obecnie nie działa. Obecny bezpłatny poziom dla kont osobistych daje podstawę 550 bezpłatnych godzin dyno każdego miesiąca.

A zweryfikowane darmowe konto daje 1000 godzin darmowej hamowni. Napisałem artykuł o tym, jak sprawiłem, że moja darmowa aplikacja nie zasypiała.

https://link.medium.com/uDHrk5HAD0

Mam nadzieję, że pomoże każdemu, kto potrzebuje rozwiązania w 2019 r

Mahdhi Rezvi
źródło
2

działa to dla mnie w aplikacji wiosennej wysyłającej jedno żądanie http co 2 minuty do ścieżki głównego adresu 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);
}
}

Pamiętaj, aby skonfigurować kontekst, aby włączyć program planujący i utworzyć komponent bean dla programu planującego

@EnableScheduling
public class AppConfig {

@Bean
public HerokuNotIdle herokuNotIdle(){
    return new HerokuNotIdle();
}
}
zeta
źródło
2

Guy, oto aplikacja heroku, którą możesz uruchomić, aby utrzymać wiele aplikacji heroku przy życiu. Po prostu dodaj adresy URL, które chcesz pingować w pliku config.json.

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

ReadyBird
źródło
1

Mam aplikację, która musi działać tylko od poniedziałku do piątku w porze lunchu. Właśnie dodałem następujący skrypt do crontab w pracy:

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

Tak więc dla każdej aplikacji po prostu upuść inną linię na swoim crontabie, taką jak:

*/5 11-15 * * 1-5 /usr/local/bin/uptimer.sh http://www.example.com
RedRoosterMobile
źródło
1

Myślę, że najłatwiejszym rozwiązaniem jest samodzielne pingowanie własnego serwera co 30 minut. Oto kod, którego używam w moim projekcie node.js, aby zapobiec zasypianiu.

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
źródło
1

Jeszcze jedno działające rozwiązanie: wokeDyno Oto post na blogu, jak to działa: Jest bardzo łatwy w aplikacji:

/* 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
źródło
1

Wykona się zadanie crona. Zobacz https://cron-job.org . Jest darmowy i niezawodny.

roshnet
źródło