Простой способ предотвратить Heroku на холостом ходу?

В бесплатных приложениях Heroku динамо, кажется, продолжает бездействовать - у моего приложения очень низкий трафик, но в моем случае это также не совсем приемлемо, когда мои пользователи должны ждать более 20 секунд, чтобы раскрутить новый динамо.

Честно говоря, с таким ожиданием многие уйдут до того, как появится первая страница.

Итак, у меня есть проблема: должен ли я платить 36 долларов в месяц, чтобы сэкономить каждому пользователю смущающие долгие 20 секунд, когда мой трафик составляет однозначные цифры в день.

Это можно обойти??

25 ответов

Решение

Вы можете установить бесплатное дополнение New Relic. Он имеет функцию мониторинга доступности, которая пингует ваш сайт два раза в минуту, предотвращая тем самым работу динамометрического стенда.

Более или менее то же решение, что и у Джесси, но, возможно, более интегрированное в Heroku... И с несколькими преимуществами (мониторинг производительности просто великолепен).

Мониторинг доступности

Примечание: всем, кто говорит, что это не работает: важная часть в моем ответе - "монитор доступности". Просто установка аддона не поможет. Вам также нужно настроить мониторинг доступности с помощью URL вашего приложения heroku.

Вы также можете попробовать http://kaffeine.herokuapp.com/, это сделано для предотвращения перехода приложений Heroku в режим сна. Он будет проверять ваше приложение каждые 10 минут, поэтому ваше приложение не будет спать. Это абсолютно бесплатно.

В качестве альтернативы Pingdom я предлагаю попробовать http://uptimerobot.com/. Это бесплатно и предлагает 5-минутный интервал проверки сайта. Это работает очень хорошо для меня.

ОБНОВЛЕНИЕ 7 мая 2015: Это больше не будет возможно, поскольку Heroku поменяет свой бесплатный динамо, чтобы не дать ему оставаться в живых в течение полных 24 часов:

Еще одно важное изменение связано со сном динамомашин или сном. Хотя неоплачиваемые приложения всегда спали после истечения времени ожидания активности, некоторые приложения использовали службы автоматического пинга для предотвращения такого поведения. бесплатные динамо разрешены 18 часов без сна в течение 24 часов, и в течение следующих нескольких недель мы начнем уведомлять пользователей о приложениях, которые превышают этот лимит. С введением хобби dyno (7 долларов в месяц) мы просим либо дать вашему приложению спать по истечении времени ожидания, либо перейти на эту новую опцию.

Когда это будет жить? Согласно их сообщению в блоге:

Приложения, работающие с 1X dyno, которые не накапливают других сборов dyno, будут постепенно перенесены в новые бесплатные dyno, начиная с 1 июля.

На мой взгляд, использование "бесплатного" уровня сервиса не должно приводить в действие производственное или клиентское приложение. Хотя вышеуказанные решения работают против холостого хода Dyno, тщательно продумайте, что вы делаете.

Если ничего другого, используйте задание cron для проверки связи с вашим сайтом и отключите проверку на известные периоды неактивного использования (т. Е. На ночь), чтобы Heroku не отказался от бесплатного уровня для всех остальных.

Простой ответ - если вы цените услугу, платите за нее.

Все эти "хитрости", чтобы получить преимущества платного обслуживания... ну, по сути, это как кража кабеля. Сомнительно даже перечислить их здесь. Что дальше, уловки о том, как пиратские игры?

Как и другой постер, я ценю бесплатный сервис по разработке и тестированию, и я буду очень раздражен всеми вами, кто нарушает этику, если Heroku покончит с этим, потому что слишком много халявщиков. Я просто не думаю, что он был достаточно прямолинеен в своей критике.

Вы можете использовать http://pingdom.com/ чтобы проверить свое приложение; если сделать это каждую минуту или около того, heroku не будет простаивать ваше приложение и не нужно будет раскручиваться.

Протестировано и работает над моим собственным приложением Heroku с использованием 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();

Я использую дополнение Heroku Scheduler, предоставленное Heroku бесплатно. После добавления это просто, как создать работу с curl http://yourapp.herokuapp.com/ и 10-минутным интервалом.

Добавьте URL-адрес вашего приложения на http://kaffeine.herokuapp.com/.

С сайта:

Кафеин пингует ваше приложение Heroku каждые 30 минут, поэтому оно никогда не заснет *

https://stackru.com/image s/594144bde0180bf11b1192f2e7f3fcfc55a306d1.png

В документации Heroku говорится, что наличие более 1 веб-динамо никогда не будет простаивать. Возможно, более дешевое решение, чем $0,09/ час, как предполагает Пьер.

Документация

Подойдет cron. См. https://cron-job.org/. Это бесплатно и надежно.

Я записал шаги:

➜ Добавьте gem 'newrelic_rpm' в ваш Gemfile при подготовке и производстве.
Install комплектация
➜ Войдите в панель управления герою и добавьте новый реликтовый аддон
Added После добавления настройте автоматический пинг на свой сайт, чтобы он не простаивал
➜ Выберите "Меню"> "Мониторинг доступности" (в разделе "Настройки") → нажмите "Включить мониторинг доступности".
➜ Введите URL-адрес для проверки связи (например, http://spokenvote.org/).
➜ Выберите 1 минуту для интервала

Большинство ответов здесь устарели или в настоящее время не работают. Текущий уровень бесплатного пользования для личных учетных записей дает 550 бесплатных рабочих часов в месяц.

А проверенная бесплатная учетная запись дает вам 1000 часов бесплатного дино. Я написал статью о том, как заставил бесплатное приложение не заснуть.

https://link.medium.com/uDHrk5HAD0

Надеюсь, это поможет всем, кто нуждается в решении в 2019 году.

Я нашел другой бесплатный сайт, который будет постоянно пинговать ваш сайт под названием Unidler

http://unidler.herokuapp.com/

То же, что и pingdom, но не требуется вход в систему.

Если у вас есть доступ к постоянно работающему Unix-серверу, вы можете установить для cron задание GET Ваш сайт. В соответствии с новыми условиями бесплатного плана, вы, вероятно, захотите отключить GETs в ночные часы, используя строку в вашем crontab, например:

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

Это инструктирует curl в GET domain.com каждые 20 минут между 8 и 22 часами.

Быть в курсе, что

  1. Не каждый, кто хочет видеть ваш сайт, живет в вашем часовом поясе и
  2. Ваш сайт может получать другие запросы в середине ночи, пробуждая ваш dyno и вызывая еще один час использования каждого запроса. Даже если никто не знает ваш домен, есть роботы и сканеры, которые активны все время. Поэтому желательно, чтобы процесс, определенный в вашем crontab, был активным только в течение 14-16 часов, чтобы обеспечить защиту от этих пробуждений.

Кроме того, убедитесь, что ваше системное время установлено правильно, чтобы окно простоя происходило, когда вы этого ожидаете.

Это мое решение.

Используйте скрипт Google Apps и установите триггер времени.

// main.js
function ping() {
  UrlFetchApp.fetch("https://<Your app>.herokuapp.com/ping_from_GAS");
}

Это очень просто!

Обратите внимание, что новые типы динамометрических систем (в настоящее время в бета-версии, поступающие в июне 2015 года) будут запрещать оставлять динамометрических будильников в режиме 24/7, так как они будут спать не менее 6 часов в день.

Поэтому постарайтесь удалить любое решение, которое вы нашли в этой теме, до того, как оно появится (или заплатите за фактически используемую вами услугу).

Для меня это работа в весеннем приложении, делающем один http-запрос каждые 2 минуты к корневому пути 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);
}
}

Не забудьте настроить свой контекст, чтобы включить планировщик и создать компонент для вашего планировщика

@EnableScheduling
public class AppConfig {

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

У меня есть приложение, которое должно работать только с понедельника по пятницу около обеда. Я просто добавил следующий скрипт в crontab на работе:

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

Поэтому для любого приложения просто добавьте еще одну строку в ваш crontab, например:

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

Я думаю, что самый простой способ исправить это - самостоятельно проверять свой сервер каждые 30 минут. Вот код, который я использую в своем проекте node.js для предотвращения сна.

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

Парень, вот приложение heroku, которое вы можете запустить, чтобы сохранить несколько приложений heroku живыми. Просто добавьте URL, которые вы хотите пропинговать, в config.json.

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

Еще одно рабочее решение: wokeDyno Вот сообщение в блоге, как это работает: Оно очень легко интегрируется в приложение:

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

если вы используете nodejs с экспрессом, вы можете добавить конечную точку, которая будет вызывать себя каждые 10 минут.

маршрутизатор:

      app.get("/keep-alive",require("path/to/keepAlive.js").keepAlive);

KeepAlive.js

      let interval;

function keepAlive(req, res) {
   if(interval) return res.end();
   
   interval = setInterval(() => {
      fetch("http://your-heroku-subdomain/keep-alive")
         .catch(err => {/*handle error here*/});
      }
   ,60_000);


   return res.end();
}

module.exports = { keepAlive }

Freshping — еще один бесплатный ресурс, который может поддерживать работоспособность вашего бесплатного приложения Heroku 24/7.

Ребята обратите внимание на это!

Приложения, использующие только бесплатный рабочий динамометр, не спят, потому что не отвечают на веб-запросы. Помните об этом, так как они могут работать 24/7 и потреблять из вашего пула часов.

(https://devcenter.heroku.com/articles/free-dyno-hours#quota)

Другие вопросы по тегам