Un modo semplice per prevenire il minimo di Heroku?


286

Nelle app gratuite di Heroku le dinamiche sembrano rimanere inattive: la mia app ha un traffico molto basso ma nel mio caso non è nemmeno accettabile che i miei utenti debbano attendere oltre 20 secondi per girare un nuovo dyno.

Francamente, con quel tipo di attesa, molti se ne andranno prima ancora che venga visualizzata la prima pagina.

Quindi, ho un problema: dovrei pagare $ 36 al mese per salvare ogni utente in modo imbarazzante di 20 secondi quando il mio traffico è in cifre singole al giorno.

C'è un modo per aggirare questo??


13
A partire dal 1 ° luglio 2015, questo non sarà più possibile, secondo l'annuncio di Heroku: blog.heroku.com/archives/2015/5/7/heroku-free-dynos . Hanno introdotto tuttavia un piano "hobby" che costa solo $ 7 al mese.
Cristian,

1
Ora ci sono server virtuali disponibili per $ 5 al mese (o meno ogni ora fatturati) che forniscono accesso completo alla shell, ecc. Ho usato DigitalOcean da oltre un anno ma sono sicuro che ce ne sono altri nello spazio per competere. IMO è una soluzione migliore se Heroku non è più libero ..
sricks

1
@sricks Un VPS completo (che è necessario gestire, mantenere aggiornato, configurare un server Git, un server Web, un server DB, un firewall, hook Git, backup, WAL-E, ecc. ecc. ecc.) è diverso da Heroku ( un PaaS). In alcuni casi vuoi il primo, in altri il secondo, ma i dollari grezzi dovrebbero essere una metrica primaria. Tempo e rischio dovrebbero essere.
elithrar,

Come installare il nuovo agente Relic sull'app RoR? newrelic.com/ruby
Manny Quintanilla,

1
A partire dal 1 ° giugno 2016, questo è di nuovo possibile se si verifica con una carta di credito. annuncio . Riceverai 1000 ore gratuite al mese e ci sono solo 730 ore al mese. Supponendo che tu abbia solo un dyno in esecuzione, puoi andare gratuitamente 24 ore su 24, 7 giorni su 7.
Patata cotta il

Risposte:


352

È possibile installare il componente aggiuntivo New Relic gratuito . Ha una funzione di monitoraggio della disponibilità che eseguirà il ping del tuo sito due volte al minuto, impedendo così al minimo di essere disattivato.

Più o meno la stessa soluzione di Jesse ma forse più integrata in Heroku ... E con alcuni vantaggi (il monitoraggio delle prestazioni è semplicemente fantastico).

Monitoraggio della disponibilità

Nota: per tutti coloro che dicono che non funziona: la parte importante nella mia risposta è "monitoraggio della disponibilità". Basta installare il componente aggiuntivo non aiuterà. Devi anche impostare il monitoraggio della disponibilità con l'URL della tua app heroku.


6
dobbiamo installare anche gem 'newrelic_rpm' per evitare che il dyno vada al minimo?
simo

3
Di quanto aumenta l'utilizzo di dyno di?
Trevoke,

4
L'ho scoperto abbastanza di recente. Si fa ancora funziona in modo eccellente. Nel caso, tuttavia, mi assicuro di eseguire una semplice query DB prima di visualizzare un messaggio "Applicazione disponibile". Questo funziona anche alla grande con Pagoda e qualsiasi altro host assonnato.
Jacob Evan Shreve,

8
@aubraus: la tua modifica è stata respinta ... Comunque: a tutti coloro che dicono che non funziona: la parte importante nella mia risposta è "monitor di disponibilità". Basta installare il componente aggiuntivo non aiuterà. Devi anche impostare il monitoraggio della disponibilità con l'URL della tua app heroku.
Pierre,

13
Nel caso qualcuno lo stia ancora cercando, il link diretto per il ping è qui: synthetics.newrelic.com/accounts/[your_account_id[/monitors/new Basta inserire il proprio ID account.
Eric Yang,

91

In alternativa a Pingdom suggerisco di provare Uptimerobot . È gratuito e offre un controllo del sito ad intervalli di 5 minuti. Funziona molto bene per me.

AGGIORNAMENTO 7 maggio 2015: questo non sarà più possibile, dal momento che Heroku cambierà il loro dyno gratuito per evitare di tenerlo in vita per 24 ore:

Un altro cambiamento importante ha a che fare con dyno che dorme, o "inattivo". Mentre le app non a pagamento hanno sempre dormito dopo un timeout di attività, alcune app hanno utilizzato i servizi di ping automatici per impedire tale comportamento. le dinamiche gratuite sono consentite 18 ore di veglia ogni 24 ore e nelle prossime settimane inizieremo a notificare agli utenti le app che superano tale limite. Con l'introduzione dell'hobby dyno ($ 7 al mese), chiediamo di far dormire la tua app dopo il timeout o di passare a questa nuova opzione.

Quando sarà live? Secondo il loro post sul blog:

Le applicazioni che eseguono un singolo dyno 1X che non accumulano altri addebiti dinamici verranno migrate gradualmente nelle nuove dinamiche gratuite a partire dal 1 ° luglio .


1
Uptimerobot sembra essere (ironicamente) a terra. È possibile iscriversi e accedere, ma se si tenta di aggiungere un nuovo monitor, si dice "monitor già
Jeff Axelrod

Sembra funzionare abbastanza, bene ... Capisco che heroku dorme cose su servizi gratuiti, ma fa schifo quando ospita un coordinatore centrale (che per natura non può essere ridimensionato).
jonasfj,

Non sono stato in grado di farlo poiché Uptimerobot richiede un indirizzo IP ?? Non riesco a vedere come farlo funzionare con un url, come un url di herokuapp. EDIT: Mio male, stavo inserendo http://e ricevendo un errore.
Ruben Martinez Jr.

1
La grande differenza è di intervalli di 5 minuti significa che saranno 5 minuti prima di ricevere una notifica se è inattivo. Usiamo Pingometer ( pingometer.com ) che ha intervalli di 1 minuto ed è stato fantastico con Heroku.
Okoboko,

9
A partire da aprile 2017, il limite di 18 ore è scaduto, puoi avere il tuo dyno gratuito attivo 24/7, a condizione che il tuo account sia verificato. devcenter-staging.heroku.com/articles/free-dyno-hour-faq .
Bagonyi,

76

A mio avviso, l'utilizzo del livello "gratuito" del servizio non dovrebbe alimentare una produzione o un'applicazione rivolta al cliente. Mentre le soluzioni di cui sopra funzionano contro il minimo di Dyno, pensa attentamente a ciò che stai facendo.

Se non altro, utilizza un processo cron per eseguire il ping del tuo sito e disabilita il controllo per periodi di utilizzo basso noti (ad esempio durante la notte) per assicurarti che Heroku non elimini il livello gratuito per tutti gli altri.


Grazie per la tua risposta. Che cosa intendi specificamente con "pensa a fondo a quello che stai facendo"?
sscirrus,

36
In gran parte per le persone che leggono le risposte di cui sopra per questa soluzione. L'obiettivo del livello gratuito su Heroku non è ospitare un'app di produzione che deve essere disponibile per i clienti. Il minimo gratuito di livello consente a Heroku di offrire questo livello per sviluppo / test, senza costi generali elevati di server costantemente in esecuzione.
drowe,

29
Va anche bene per un sito di "produzione" con traffico ridotto e senza clienti paganti, che non si desidera attendere trenta secondi per caricare la prima pagina.
alxndr,

2
Hai ragione, ma ci sono molti motivi validi per eseguire un solo dyno ... Come avere un unico coordinatore con qualche stato in memoria ...
jonasfj

17
Non sai molto della sua app, quindi penso che il tuo commento sia abbastanza giudicante.
wobbily_col,

60

Puoi anche provare http://kaffeine.herokuapp.com (creato da me), fatto per impedire alle app Heroku di andare a dormire. Esegue il ping della tua app ogni 10 minuti in modo che l'app non vada in modalità sospensione. È completamente gratuito.


1
è possibile rimuovere il tuo herokuapp dal tuo servizio?
meteor

2
Non accetta più nuove app. La sua pagina GitHub contiene diversi problemi al riguardo. Questa risposta può essere considerata ormai obsoleta.
nickolay.laptev,

45

Puoi utilizzare http://pingdom.com/ per controllare la tua app; se fatto ogni minuto o giù di lì, heroku non farà girare la tua app e non dovrà girare.


2
Così difficile decidere tra le due risposte! Alla fine sono andato con Newrelic perché ho già un account lì. Grazie mille per questo fantastico suggerimento: in realtà ha risolto anche il mio problema. :) +1.
sscirrus,

2
Perché farlo ogni minuto? Come puoi vedere nella risposta di @ newe1344, Heroku gira la dinastia dopo un'ora di inattività. Quindi sicuramente la pinta ogni 59 minuti è più efficace?
Darwin Tech,

2
Segnala quando è inattivo, quindi la frequenza dei minuti funziona bene sia per prevenire il sonno, sia per segnalare i tempi di inattività
Jesse Wolgamott,

Non penso che sia (ancora?) Gratuito.
rahulserver,

@rahulserver - Hai ragione, Pingdom non ha più un account gratuito.
John Lehmann,

40

Risposta semplice: se apprezzi il servizio, pagalo.

Tutti questi "trucchi" per ottenere i vantaggi del servizio a pagamento ... beh, è ​​essenzialmente come rubare il cavo. Discutibile persino elencarli qui. Qual è il prossimo, trucchi su come piratare i giochi?

Come un altro poster qui, apprezzo il servizio gratuito per lo sviluppo e i test e sarei molto infastidito da tutti i tuoi tipi etici se Heroku lo eliminasse perché ci sono troppi freeloader. Non penso che fosse abbastanza diretto nelle sue critiche.


14
È un servizio a pagamento, con determinati termini. Perché non ottimizzare l'utilizzo del servizio entro questi termini per ottenere il massimo da esso?
pkinsky,

8
Beh, credo di aver già indicato il motivo, ma per spiegarlo un po 'più in là - l'uso previsto dell'hosting gratuito è chiaro. E il vantaggio di 'sempre attivo' è un vantaggio di pagare anche solo la miseria per un secondo lavoratore. Tutti gli exploit qui coinvolgono risorse inutilmente consumate per uscire dal pagamento di un servizio. È un comportamento vergognoso. Perchè dovrebbe interessarmi? Perché se si stufano, il loro ricorso sarà quello di eliminare il servizio gratuito che, usato come previsto, è di grande valore per me.
Elc,

2
Va bene solo per chiarire per voi downvoter drive-by, non solo chiede "C'è un modo per aggirare?" chiede anche "Dovrei pagare ..." Questo è quello che sto rispondendo. È la domanda più fondamentale. Sicuramente ci sono tonnellate di modi banalmente facili da aggirare. Sono eticamente sbagliati, quindi nel migliore dei casi è una perdita di tempo dettagliarli qui, e probabilmente considerevolmente peggio in quanto costituisce abilitazione e incoraggiamento dei comportamenti scorretti.
elc,

4
È un po 'esagerato. Distribuiamo su heroku durante i test. Quando i nostri clienti accedono al sito quando è inattivo, presumono che ci sia qualcosa di sbagliato nell'app che abbiamo sviluppato per connetterci al servizio. Mantenere vivo il sito per motivi di reattività per provare un'app che potrebbe non vedere mai la luce del giorno non è affatto etico. Sembra una convinzione personale, non etica. Se non viola le regole o la legge, la tua presunzione etica è l'unica cosa sbagliata . Freemium è un modello aziendale legittimo. Va bene "approfittare" della parte gratuita di ciò. È previsto.
Matt Long,

1
Quindi la tua giustificazione è "tutti gli altri lo stanno facendo" Questo non è davvero un nuovo argomento. O convincente. modifica Mi dispiace che tu abbia fatto un punto valido per alcune persone. Che ciò che viene fatto non sia esplicitamente vietato, quindi non è sbagliato. So che ci sono persone che credono "ciò che non è espressamente vietato è permesso" e lo spingono oltre a dire che non è solo permesso ma "non è sbagliato". L'intero atteggiamento è ciò che definirei superamento in un modo molto egoistico. Ma si riduce a una differenza filosofica fondamentale.
elc

30

Testato e funzionante sulla mia app Heroku usando Node.js 0.10.x il 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();

2
A mio avviso la soluzione migliore, poiché non si basa su alcun servizio di terze parti. Grazie :)
electronix384128

Sembra che non eviti di dormire. Ma funziona per risalire automaticamente. Non so se questo comportamento sia dovuto a cambiamenti, in realtà la tua soluzione proviene da quasi due anni fa.
jgato,

20

Uso gratuitamente il componente aggiuntivo Heroku Scheduler fornito da Heroku. Una volta aggiunto, è semplice come creare un lavoro con 'curl http://yourapp.herokuapp.com ' e un intervallo di 10 minuti.


11

Dice nella documentazione di Heroku che avere più di un dyno web non sarà mai inattivo. Forse una soluzione più economica di $ 0,09 / ora come suggerisce Pierre.

inserisci qui la descrizione dell'immagine

Documentazione


6
Il componente aggiuntivo Heroku ha una versione standard gratuita.
sscirrus,

9

Ho scritto i passaggi:

➜ Aggiungi gemma 'newrelic_rpm' al tuo Gemfile in staging e produzione
➜ bundle install
➜ Accedi al pannello di controllo di heroku e aggiungi un nuovo componente aggiuntivo
➜ Una volta aggiunto, imposta il ping automatico sul tuo sito Web in modo che non sia inattivo
➜ Sfoglia menu> Monitoraggio disponibilità ( in Impostazioni) → Fai clic su "Attiva monitoraggio disponibilità"
➜ Inserisci l'URL per eseguire il ping (ad esempio: http://spokenvote.org )
➜ Seleziona 1 minuto per l'intervallo


3
Grazie Pratik. Cordiali saluti, se esegui il ping della tua app ogni minuto, utilizzerai la larghezza di banda senza alcun vantaggio per il minimo. A meno che tu non abbia un altro motivo, è sicuro ridimensionare quel tocco.
sscirrus,

Grazie per il suggerimento @sscirrus
Khadloya,

3
Heroku metterà il tuo dyno a dormire solo dopo 1 ora di inattività, quindi puoi ridimensionare l'intervallo a 1 ora (o forse 50 minuti per essere al sicuro).
David Underwood,

Domanda: ti capita di sapere dove cambiare quell'intervallo di ping? Sembra non essere un'opzione disponibile nelle impostazioni della dashboard.
mishap_n


3

Si noti che i nuovi tipi di dinamo ( attualmente in beta , in arrivo a giugno 2015) vieteranno di tenere un dinamo gratuito risvegliato 24 ore su 24, 7 giorni su 7, poiché dovrebbe dormire almeno 6 ore al giorno.

Quindi prova a rimuovere qualsiasi soluzione trovata in questo thread prima che venga visualizzato (o paga per il servizio effettivamente utilizzato).


3

Se hai accesso a un server unix sempre attivo, puoi impostare un processo cron sul GETtuo sito web. Con i nuovi termini del piano gratuito, probabilmente vorrai disabilitare le GETs nelle ore notturne, usando una linea nel tuo crontab in questo modo:

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

Questo indica curla GETdomain.com ogni 20 minuti tra le ore 8 e 22.

Fai attenzione a

  1. Non tutti quelli che vogliono vedere il tuo sito web vivono nel tuo fuso orario e
  2. Il tuo sito potrebbe ricevere altre richieste nel mezzo della notte, riattivando il tuo dyno e causando un'altra ora di utilizzo per ogni richiesta. Anche se nessun altro conosce il tuo dominio, ci sono bot e crawler che sono sempre attivi. Pertanto, è consigliabile impostare il processo definito nel crontab in modo che sia attivo solo da 14 a 16 ore per fornire un buffer a fronte di questi risvegli

Inoltre, assicurarsi che l'ora del sistema sia impostata correttamente in modo che la finestra di inattività si verifichi quando previsto.


3

La maggior parte delle risposte qui sono obsolete o attualmente non funzionano. L'attuale livello gratuito per gli account personali fornisce una base di 550 ore dinamiche gratuite ogni mese.

E un account gratuito verificato ti dà 1000 ore di prova gratuita. Ho scritto un articolo su come ho reso attiva la mia app gratuita.

https://link.medium.com/uDHrk5HAD0

Spero che aiuti chiunque abbia bisogno di una soluzione nel 2019


2

questo lavoro per me in un'applicazione Spring che fa una richiesta http ogni 2 minuti al percorso dell'URL radice `

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

Ricorda di configurare il tuo contesto per abilitare lo scheduler e creare il bean per lo scheduler

@EnableScheduling
public class AppConfig {

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


1

Ho un'app che deve funzionare solo dal lunedì al venerdì verso l'ora di pranzo. Ho appena aggiunto il seguente script al crontab al lavoro:

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

Quindi per qualsiasi app basta inserire un'altra riga nel crontab come:

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

1

Penso che la soluzione più semplice sia quella di eseguire il ping automatico del proprio server ogni 30 minuti. Ecco il codice che uso nel mio progetto node.js per evitare di dormire.

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

Un'altra soluzione funzionante: wokeDyno Ecco un post sul blog come funziona: è integrato nell'app molto semplice:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.