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


286

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

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

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

Есть ли способ обойти это??


13
По состоянию на 1 июля 2015 года это будет невозможно, согласно сообщению Heroku: blog.heroku.com/archives/2015/5/7/heroku-free-dynos . Однако они представили план «хобби», который стоит всего 7 долларов в месяц.
Кристиан

1
Теперь могут быть виртуальные серверы, доступные за 5 долларов в месяц (или менее оплачиваемые ежечасно), которые обеспечивают полный доступ к оболочке и т. Д. Я использую DigitalOcean уже больше года, но я уверен, что есть другие, кто может конкурировать. ИМО лучшее решение, если Heroku больше не свободен ..
sricks

1
@sricks Полный VPS (которым нужно управлять, поддерживать его в актуальном состоянии, настраивать Git-сервер, веб-сервер, сервер БД, брандмауэр, перехватчики Git, резервные копии, WAL-E и т. д., и т. д.) - это нечто отличное от Heroku ( PaaS). В некоторых случаях вы хотите первое, в других последнее, но необработанные доллары должны быть основным показателем. Время и риск должны быть.
элитрар

Как установить агент New Relic на приложение RoR? newrelic.com/ruby
Мэнни Кинтанилья

1
С 1 июня 2016 года это возможно снова, если вы подтвердите с помощью кредитной карты. объявление . Вы получите 1000 бесплатных часов в месяц, а в месяце всего 730 часов. При условии, что у вас работает только один динамо, вы можете работать круглосуточно и без выходных.
Запеченный картофель

Ответы:


352

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

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

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

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


6
Нужно ли устанавливать gem 'newrelic_rpm', чтобы динамбут не работал?
Симо

3
Насколько это увеличивает использование dyno?
Тревок

4
Я обнаружил это довольно недавно. Это все еще работает превосходно. Однако на всякий случай я проверяю простой запрос к БД, прежде чем отобразить сообщение «Приложение доступно». Это также прекрасно работает с пагодой и любым другим сонным хозяином.
Джейкоб Эван Шрив

8
@aubraus: ваше редактирование было отклонено ... В любом случае: всем, кто говорит, что оно не работает: важная часть в моем ответе - «Монитор доступности». Просто установка аддона не поможет. Вам также необходимо настроить мониторинг доступности с помощью URL вашего приложения heroku.
Пьер

13
В случае, если кто-то все еще ищет это, прямая ссылка для пинга находится здесь: synthetics.newrelic.com/accounts/[your_account_id]/monitors/new Просто подпишите в идентификаторе вашего аккаунта.
Эрик Ян

91

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

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

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

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

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


1
Uptimerobot, кажется, (иронично) не работает. Вы можете зарегистрироваться и войти в систему, но если вы попытаетесь добавить новый монитор, он просто говорит: «Монитор уже есть»
Джефф Аксельрод

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

Я не смог сделать это, так как Uptimerobot требует IP-адрес ?? Я не понимаю, как заставить его работать с URL-адресом, как с URL-адресом herokuapp. РЕДАКТИРОВАТЬ: мой плохой, я вставил http://и получил ошибку.
Рубен Мартинес младший

1
Большая разница в 5-минутных интервалах означает, что пройдет 5 минут, прежде чем вы получите уведомление, если он не работает. Мы используем Pingometer ( pingometer.com ) с интервалом в 1 минуту, и это здорово с Heroku.
Okoboko

9
По состоянию на апрель 2017 года, 18-часовой лимит исчерпан, вы можете иметь бесплатный динамо до 24/7, если ваша учетная запись подтверждена. devcenter-staging.heroku.com/articles/free-dyno-hour-faq .
bagonyi

76

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

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


Спасибо за Ваш ответ. Что вы имеете в виду под «тщательно продумайте, что вы делаете»?
sscirrus

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

29
Это также хорошо для «производственного» сайта с небольшим трафиком и без платящих клиентов, которым не нужно ждать тридцать секунд, пока загрузится первая страница.
alxndr

2
Вы правы, но есть много веских причин, чтобы просто запустить одну динамограмму ... Например, наличие одного координатора с некоторым состоянием в памяти ...
jonasfj

17
Вы не очень много знаете о его приложении, поэтому я думаю, что ваш комментарий достаточно объективен, учитывая.
wobbily_col

60

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


1
Можно ли удалить ваш herokuapp из вашего сервиса?
Метеор

2
Он больше не принимает новые приложения. Его страница GitHub содержит несколько вопросов об этом. Этот ответ сейчас можно считать устаревшим.
Николай.Лаптев

45

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


2
Так сложно выбрать между двумя ответами! В конце концов я пошел с Newrelic, потому что у меня уже есть аккаунт там. Большое спасибо за это замечательное предложение - оно действительно решило и мою проблему. :) +1.
sscirrus

2
Почему это каждую минуту? Как вы можете видеть в ответе @ newe1344, Heroku вращает динамо после часа бездействия. Так наверняка тоска каждые 59 минут более эффективна?
Дарвин Tech

2
Он сообщает, когда он выключен, поэтому минутная частота хорошо работает как для предотвращения сна, так и для сообщения о
простоях

Я не думаю, что это (все еще?) Бесплатно.
rahulserver

@rahulserver - Вы правы, у Pingdom больше нет бесплатного аккаунта.
Джон Леманн

40

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

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

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


14
Это платная услуга с определенными условиями. Почему бы не оптимизировать использование службы в эти сроки, чтобы получить максимальную отдачу от нее?
pkinsky

8
Ну, я полагаю, что я уже указал причину, но, если разобраться в этом подробнее, предполагаемое использование бесплатного хостинга очевидно. И преимущество «всегда на связи» - это привилегия платить даже одну гроши за второго работника. Все эксплойты здесь включают в себя бесполезное использование ресурсов для оплаты услуг. Это позорное поведение. Почему я должен переживать? Потому что, если они сыт по горло, они могут покончить с бесплатным обслуживанием, которое, если оно используется по назначению, имеет для меня большую ценность.
Elc

2
Ладно, просто чтобы уточнить для вас, кто ездит вниз, он не только спрашивает: "Есть ли способ обойти это?" он также спрашивает: «Должен ли я платить ...» На это я и отвечаю. Это более фундаментальный вопрос. Конечно, есть множество простых способов обойти. Они этически ошибочны, поэтому, в лучшем случае, детализировать их здесь в лучшем случае - пустая трата времени, и, возможно, значительно хуже, поскольку это создает возможность и поощряет плохое поведение.
Elc

4
Это немного перебор. Размещаем к героку во время тестирования. Когда наши клиенты заходят на сайт, когда он простаивает, они предполагают, что что-то не так с приложением, которое мы разработали для подключения к услуге. Поддерживать сайт в живую ради отзывчивости демонстрации приложения, которое никогда не увидит свет, вряд ли неэтично. Звучит как личное убеждение, а не этика. Если это не нарушает правила или закон, ваша этическая презумпция является единственной ошибкой . Freemium является законной бизнес-моделью. Это нормально, чтобы «воспользоваться» бесплатной частью этого. Это ожидается.
Мэтт Лонг

1
Таким образом, вы оправдываетесь тем, что «все это делают». Это не совсем новый аргумент. Или убедительный. редактировать Извините, вы делаете замечание, которое действительно для некоторых людей. То, что делается, явно не запрещено, поэтому не ошибается. Я знаю, что есть люди, которые верят, что «то, что явно не запрещено, разрешено», и продолжают говорить, что это не только разрешено, но и «не неправильно». Это целое отношение - это то, что я бы назвал переоценкой очень корыстным способом. Но это сводится к фундаментальной философской разнице.
elc

30

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

2
На мой взгляд, лучшее решение, так как оно не зависит от какой-либо сторонней службы. Спасибо :)
Electronix384128

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

20

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


11

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

введите описание изображения здесь

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


6
У дополнения Heroku есть бесплатная стандартная версия.
sscirrus

9

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

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


3
Спасибо, Пратик. К вашему сведению, если вы пингуете свое приложение каждую минуту, вы будете использовать пропускную способность без какой-либо выгоды для простоя. Если у вас нет другой причины, безопасно уменьшить это прикосновение.
sscirrus

Спасибо за предложение @sscirrus
Пратик Хадлоя

3
Heroku переведет ваш динамо в спящий режим только после 1 часа бездействия, поэтому вы можете уменьшить интервал до 1 часа (или, может быть, 50 минут, чтобы быть в безопасности).
Дэвид Андервуд

Вопрос: Вы случайно не знаете, где изменить этот интервал пинга? Кажется, это не доступная опция в настройках панели.
mishap_n

4

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

http://unidler.herokuapp.com/

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


Как убрать после добавления?
Lekr0

3

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

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


3

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

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

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

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

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

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


3

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

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

https://link.medium.com/uDHrk5HAD0

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


2

для меня это работа в весеннем приложении, делающем один 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();
}
}

2

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

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


1

У меня есть приложение, которое нужно запускать только с понедельника по пятницу около обеда. Я просто добавил следующий скрипт в 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

1

Я думаю, что самое простое решение - это самостоятельно пинговать свой собственный сервер каждые 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

1

Еще одно рабочее решение: 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
});

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.