Maneira fácil de impedir que o Heroku esteja ocioso?


285

Nos aplicativos gratuitos Heroku, os dynos parecem continuar ociosos - meu aplicativo tem tráfego muito baixo, mas também não é realmente aceitável no meu caso que meus usuários tenham que esperar mais de 20 segundos para criar um novo dinamômetro.

Francamente, com esse tipo de espera, muitos vão embora antes que a primeira página seja exibida.

Portanto, tenho um problema: devo pagar US $ 36 por mês para economizar a cada usuário 20 segundos embaraçosamente longos, quando meu tráfego estiver na casa de um dígito por dia.

Existe uma maneira de contornar isso?


13
A partir de 1º de julho de 2015, isso não será mais possível, de acordo com o anúncio da Heroku: blog.heroku.com/archives/2015/5/7/heroku-free-dynos . Eles introduziram, no entanto, um plano de "hobby" que custa apenas US $ 7 / mês.
Cristian

1
Agora existem servidores virtuais disponíveis por US $ 5 / mês (ou menos cobrados a cada hora) que fornecem acesso total ao shell, etc. Eu uso o DigitalOcean há mais de um ano, mas tenho certeza de que há outros no espaço para competir. IMO uma solução melhor se Heroku não é mais livre ..
sricks

1
@sricks Um VPS completo (que você precisa gerenciar, manter atualizado, configurar um servidor Git, servidor Web, servidor DB, firewall, ganchos Git, backups, WAL-E, etc, etc, etc) é diferente do Heroku ( PaaS). Em alguns casos, você deseja o primeiro, em outros o último, mas o valor bruto deve ser a métrica principal. Tempo e risco devem ser.
Elithrar # 22/15

Como instalar o agente New Relic no aplicativo RoR? newrelic.com/ruby
Manny Quintanilla

1
A partir de 1 de junho de 2016, isso será possível novamente se você confirmar com um cartão de crédito. anúncio . Você receberá 1000 horas gratuitas por mês e há apenas 730 horas em um mês. Supondo que você tenha apenas um dinamômetro em execução, você pode ir 24/7 gratuitamente.
Baked Potato

Respostas:


351

Você pode instalar o complemento gratuito da New Relic . Ele possui um recurso de monitor de disponibilidade que fará ping em seu site duas vezes por minuto, impedindo que o dinamômetro fique ocioso.

Mais ou menos a mesma solução que o Jesse, mas talvez mais integrada ao Heroku ... E com algumas vantagens (o monitoramento de desempenho é ótimo).

Monitoramento de disponibilidade

Nota: para todos os que dizem que não funciona: a parte importante na minha resposta é "monitor de disponibilidade". Apenas instalar o complemento não ajudará. Você também precisa configurar o monitoramento de disponibilidade com o URL do seu aplicativo heroku.


6
também precisamos instalar a gem 'newrelic_rpm' para impedir que o dinamômetro fique ocioso?
simo

3
Quanto isso aumenta o uso do dinamômetro?
Trevoke

4
Acabei de descobrir isso recentemente. Ele faz ainda funcionar perfeitamente. Apenas para garantir, faça uma consulta simples ao banco de dados antes de exibir a mensagem 'Aplicativo disponível'. Isso também funciona muito bem com o Pagoda e qualquer outro host com sono.
Jacob Evan Shreve

8
@aubraus: sua edição foi rejeitada ... Enfim: para todos que dizem que não funciona: a parte importante da minha resposta é "monitor de disponibilidade". Apenas instalar o complemento não ajudará. Você também precisa configurar o monitoramento de disponibilidade com o URL do seu aplicativo heroku.
Pierre

13
Caso alguém ainda esteja procurando por isso, o link direto para o ping está aqui: synthetics.newrelic.com/accounts/[your_account_id.la/monitors/new Basta inserir o ID da sua conta.
Eric Yang

91

Como alternativa ao Pingdom, sugiro tentar o Uptimerobot . É gratuito e oferece 5 minutos de verificação no local. Funciona muito bem para mim.

ATUALIZAÇÃO 7 de maio de 2015: Isso não será mais possível, pois o Heroku mudará seu dinamômetro gratuito para evitar mantê-lo vivo por 24 horas:

Outra mudança importante tem a ver com não dormir, ou "ficar ocioso". Embora os aplicativos não pagos sempre tenham dormido após um tempo limite de atividade, alguns aplicativos usavam serviços de ping automático para impedir esse comportamento. dynos gratuitos têm 18 horas de vigília por período de 24 horas e, nas próximas semanas, começaremos a notificar os usuários de aplicativos que excedam esse limite. Com a introdução do hobby dyno (US $ 7 por mês), solicitamos que seu aplicativo durma após o tempo limite ou atualize para esta nova opção.

Quando isso vai ser transmitido? De acordo com o post do blog:

Os aplicativos executando um único dinamômetro 1X que não acumulem outras cobranças serão migrados gradualmente para os novos dynos gratuitos a partir de 1º de julho .


1
O Uptimerobot parece estar (ironicamente) inativo. Você pode se inscrever e entrar, mas se você tentar adicionar um novo monitor, ele apenas diz "monitor de já
Jeff Axelrod

Parece funcionar razoavelmente, bem ... Eu entendo que o heroku dorme em serviços gratuitos, mas é péssimo ao hospedar um coordenador central (que por natureza não pode ser dimensionado).
Jonasfj #

Eu não era capaz de fazer isso como Uptimerobot requer um endereço IP? Não consigo ver como fazê-lo funcionar com um URL, como um URL herokuapp. Edição: Meu mal, eu estava colocando no http://e recebendo um erro.
Ruben Martinez Jr.

1
A grande diferença é que intervalos de 5 minutos significam que serão necessários 5 minutos antes de você ser notificado se estiver inoperante. Usamos o Pingometer ( pingometer.com ), que tem intervalos de 1 minuto e tem sido ótimo com o Heroku.
okoboko

9
A partir de abril de 2017, o limite de 18 horas se foi, você poderá ter seu dinamismo gratuito 24 horas por dia, sete dias por semana, desde que sua conta seja verificada. devcenter-staging.heroku.com/articles/free-dyno-hour-faq .
bagonyi

76

Na minha opinião, o uso do nível 'gratuito' do serviço não deve alimentar uma aplicação de produção ou voltada para o cliente. Enquanto as soluções acima funcionam contra o modo Dyno, pense bem no que está fazendo.

Se nada mais, use um trabalho cron para executar ping no site e desative a verificação de períodos conhecidos de baixo uso (por exemplo, durante a noite) para garantir que o Heroku não elimine o nível gratuito para todos os outros.


Obrigado pela sua resposta. O que você quer dizer especificamente com 'pense bem sobre o que está fazendo'?
sscirrus

36
Principalmente para as pessoas que leem as respostas acima para esta solução. O objetivo do nível gratuito no Heroku não é hospedar um aplicativo de produção que precisa estar disponível para os clientes. A ociosidade da camada livre permite que a Heroku ofereça esse nível para desenvolvimento / teste, sem um grande custo adicional de servidores em execução constante.
Drowe

29
Também é bom para um site de "produção" com pouco tráfego e sem clientes pagantes, que você não deseja esperar trinta segundos para que a primeira página seja carregada.
Alxndr #

2
Você está correto, mas há muitas razões válidas para apenas correr um dyno ... como ter um único coordenador com algum estado na memória ...
jonasfj

17
Você não sabe muito sobre o aplicativo dele, então acho que seu comentário é bastante crítico.
wobbily_col

60

Você também pode tentar http://kaffeine.herokuapp.com (criado por mim), feito para impedir que os aplicativos Heroku entrem no modo de suspensão. Ele fará o ping do seu aplicativo a cada 10 minutos, para que ele não durma. É completamente grátis.


1
é possível remover seu herokuapp do seu serviço?
meteor

2
Ele não aceita mais novos aplicativos. Sua página do GitHub contém vários problemas sobre isso. Esta resposta pode ser considerada obsoleta agora.
Nickolay.laptev

45

Você pode usar http://pingdom.com/ para verificar seu aplicativo; se isso for feito a cada minuto, o heroku não desativará seu aplicativo e não precisará girar.


2
Tão difícil de decidir entre as duas respostas! No final, fui com a Newrelic porque já tenho uma conta lá. Muito obrigado por essa ótima sugestão - ela também resolveu meu problema. :) +1.
31811 sscirrus

2
Por que fazer isso a cada minuto? Como você pode ver na resposta de @ newe1344, Heroku gira o dinamômetro após uma hora de inatividade. Então, certamente, ansiando a cada 59 minutos é mais eficaz?
Darwin Tecnologia

2
Ele informa quando é baixo, de modo a frequência minutos funciona bem tanto para o sono impedindo, eo tempo de inatividade relatórios
Jesse Wolgamott

Eu não acho que é (ainda?) Grátis.
precisa saber é o seguinte

@rahulserver - Você está correto, Pingdom não tem mais uma conta gratuita.
John Lehmann

40

Resposta fácil - se você valoriza o serviço, pague por ele.

Todos esses 'truques' para obter os benefícios do serviço pago ... bem, é essencialmente como roubar cabos. Questionável até listá-los aqui. O que vem a seguir, truques sobre como piratear jogos?

Como outro pôster aqui, eu valorizo ​​o serviço gratuito para desenvolvimento e teste e ficarei muito irritado com todos os tipos de ética se o Heroku acabar com ele, porque há muitos freeloaders. Só acho que ele não foi direto o suficiente em suas críticas.


14
É um serviço pago, com certos termos. Por que não otimizar o uso do serviço dentro desses termos para aproveitar ao máximo?
pkinsky

8
Bem, acredito que já indiquei o motivo, mas para explicar um pouco mais - o uso pretendido da hospedagem gratuita é claro. E a vantagem de "sempre ativo" é uma vantagem de pagar apenas a ninharia por um segundo trabalhador. Todas as explorações aqui envolvem consumir recursos inutilmente para não pagar por um serviço. É um comportamento vergonhoso. Por que eu deveria me importar? Porque, se ficarem cansados, seu recurso será acabar com o serviço gratuito que, usado como pretendido, é de grande valor para mim.
elc

2
Tudo bem, só para esclarecer para você os que recusam, ele não pergunta apenas "Existe uma maneira de contornar isso?" ele também pergunta "Devo estar pagando ..." É isso que estou respondendo. É a questão mais fundamental. Claro, existem várias maneiras trivialmente fáceis de ignorar. Eles estão eticamente errados, portanto, na melhor das hipóteses, é uma perda de tempo detalhá-los aqui e, sem dúvida, consideravelmente pior, pois constitui um comportamento propício e encorajador.
elc

4
Isso é um pouco exagerado. Implementamos o heroku durante o teste. Quando nossos clientes acessam o site quando estão ociosos, eles assumem que há algo errado com o aplicativo que desenvolvemos para conectar-se ao serviço. Manter o site vivo por uma questão de responsividade para demonstrar um aplicativo que talvez nunca veja a luz do dia dificilmente é antiético. Parece uma convicção pessoal, não ética. Se não violar as regras ou a lei, sua presunção ética é a única coisa errada . Freemium é um modelo de negócios legítimo. Não há problema em "tirar proveito" da parte gratuita disso. Isso é esperado.
Matt Long

1
Portanto, sua justificativa é "todo mundo está fazendo isso". Esse não é realmente um argumento novo. Ou convincente. edit Desculpe, você faz um argumento válido para algumas pessoas. Que o que está sendo feito não é explicitamente proibido, portanto, não está errado. Eu sei que existem pessoas que acreditam que 'o que não é expressamente proibido é permitido' e levam adiante dizendo que isso não é apenas permitido, mas que 'não está errado'. Toda essa atitude é o que eu chamaria de exagero de uma maneira muito egoísta. Mas isso se resume a uma diferença filosófica fundamental.
elc 14/07

30

Testei e trabalhei no meu próprio aplicativo Heroku usando o Node.js 0.10.x em 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
Na minha opinião, a melhor solução, pois não depende de nenhum serviço de terceiros. Obrigado :)
electronix384128

Parece que não evita dormir. Mas funciona para subir automaticamente novamente. Eu não sei se esse comportamento é devido a mudanças, na verdade sua solução vem de quase dois anos atrás.
jgato


11

Ele diz na documentação do Heroku que ter mais de um dinamômetro da web nunca ficará ocioso. Possivelmente uma solução mais barata que US $ 0,09 / hora, como Pierre sugere.

insira a descrição da imagem aqui

Documentação


6
O complemento Heroku tem uma versão padrão gratuita.
Sscirrus

9

Eu escrevi as etapas:

➜ Adicione gem 'newrelic_rpm' ao seu Gemfile em estadiamento e produção
install instalação do pacote
➜ Entre no painel de controle heroku e adicione addon newrelic
➜ Depois de adicionado, configure o ping automático no seu site para que ele não fique inativo
➜ em Configurações) → Clique em “Ativar Monitoramento de Disponibilidade”
➜ Digite o URL para executar o ping (por exemplo: http://spokenvote.org )
➜ Selecione 1 minuto para o intervalo


3
Obrigado Pratik. Para sua informação, se você executar ping em seu aplicativo a cada minuto, estará usando a largura de banda sem nenhum benefício para ficar ocioso. A menos que você tenha outro motivo, é seguro dimensionar isso de volta um toque.
Sscirrus

Obrigado pela sugestão @sscirrus
Pratik Khadloya

3
O Heroku só colocará seu dinamômetro para dormir após 1 hora de inatividade, para que você possa escalar o intervalo de volta para 1 hora (ou talvez 50 minutos para ficar em segurança).
David Underwood

Pergunta: Você sabe onde alterar esse intervalo de ping? Parece não ser uma opção disponível nas configurações do painel.
mishap_n


3

Observe que os novos tipos de dinamômetro ( atualmente em beta , entrando em junho de 2015) proibirão manter um dinamômetro livre acordado 24 horas por dia, 7 dias por semana, pois seria necessário dormir pelo menos 6 horas por dia.

Portanto, tente remover qualquer solução encontrada neste segmento antes que ela seja lançada (ou pague pelo serviço que você realmente usa).


3

Se você tiver acesso a um servidor unix sempre ativo, poderá definir um trabalho cron no GETseu site. Sob os novos termos do plano gratuito, você provavelmente desejará desativar os GETs durante a noite, usando uma linha no seu crontab como esta:

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

Isso instrui curlao GETdomain.com a cada 20 minutos entre as 8 e 22 horas.

Esteja ciente que

  1. Nem todo mundo que deseja ver seu site vive no seu fuso horário e
  2. Seu site pode receber outras solicitações no meio da noite, acordando seu dinamômetro e causando mais uma hora de tempo de uso para cada solicitação. Mesmo que ninguém mais conheça seu domínio, existem bots e rastreadores ativos o tempo todo. Portanto, é aconselhável definir o processo definido no seu crontab para ficar ativo por apenas 14 a 16 horas para fornecer um buffer contra esses despertares

Além disso, verifique se a hora do sistema está configurada corretamente para que a janela de tempo ocioso aconteça quando você espera.


3

A maioria das respostas aqui estão desatualizadas ou atualmente não estão funcionando. O nível gratuito atual para contas pessoais oferece uma base de 550 horas dinâmicas gratuitas por mês.

E uma conta gratuita verificada oferece 1000 horas de dinamômetro gratuito. Escrevi um artigo sobre como fiz meu aplicativo gratuito ficar acordado.

https://link.medium.com/uDHrk5HAD0

Espero que ajude quem precisa de uma solução em 2019


2

esse trabalho para mim em um aplicativo spring fazendo uma solicitação http a cada 2 minutos para o caminho do URL raiz `

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

Lembre-se de configurar seu contexto para ativar o planejador e criar o bean para seu planejador

@EnableScheduling
public class AppConfig {

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


1

Eu tenho um aplicativo que só precisa ser executado de segunda a sexta na hora do almoço. Acabei de adicionar o seguinte script ao crontab no trabalho:

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

Portanto, para qualquer aplicativo, basta soltar outra linha no seu crontab, como:

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

1

Eu acho que a solução mais fácil para isso é executar ping no seu próprio servidor a cada 30 minutos. Aqui está o código que eu uso no meu projeto node.js para evitar 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

1

Mais uma solução de trabalho: wokeDyno Aqui está um post de blog como funciona: É muito fácil integrar o aplicativo:

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.