Простий спосіб запобігти Heroku простоювати?


285

У безкоштовних додатках Heroku диноз, здається, не працює в режимі очікування - мій додаток має дуже низький трафік, але в моєму випадку це також не дуже прийнятно, що моїм користувачам доводиться чекати 20+ секунд, щоб розпочати нове дино.

Відверто кажучи, при такому очікуванні багато хто піде, перш ніж відобразиться перша сторінка.

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

Чи є спосіб цього ??


13
З 1 липня 2015 року це більше неможливо буде, згідно з повідомленням Heroku: blog.heroku.com/archives/2015/5/7/heroku-free-dynos . Однак вони ввели план "хобі", який коштує всього 7 доларів на місяць.
Крістіан

1
Зараз можуть бути доступні віртуальні сервери за 5 доларів на місяць (або щомісячно платити за годину), які забезпечують повний доступ до оболонки і т. Д. Я використовував DigitalOcean вже більше року, але я впевнений, що є інші, хто може змагатися. ІМО - краще рішення, якщо Героку більше не буде ..
хитрощі

1
@sricks Повний VPS (який потрібно керувати, постійно оновлювати, налаштовувати Git-сервер, веб-сервер, сервер DB, брандмауер, гачки Git, резервні копії, WAL-E тощо, тощо, тощо) - це інша річ від Heroku ( a PaaS). В одних випадках ви хочете, щоб перші, в інших - останні, але сирі долари повинні бути основним показником. Час і ризик повинні бути.
елітар

Як встановити агент New Relic на додаток RoR? newrelic.com/ruby
Manny Quintanilla

1
З 1 червня 2016 року це можливо знову, якщо ви підтвердите кредитну карту. оголошення . Ви отримаєте 1000 безкоштовних годин на місяць, а всього 730 годин на місяць. Якщо припустити, що у вас працює лише один дино, ви можете їхати 24/7 безкоштовно.
запечена картопля

Відповіді:


351

Ви можете встановити безкоштовний додаток New Relic . Він має функцію монітору доступності, яка буде оновлювати ваш сайт двічі на хвилину, тим самим запобігаючи програмі Dyno не працювати.

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

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

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


6
чи потрібно також встановлювати дорогоцінний камінь 'newrelic_rpm', щоб запобігти простою дино?
simo

3
На скільки це збільшує використання dyno?
Тревок

4
Я це нещодавно відкрив. Вона робить все ще працює відмінно. Однак на всякий випадок я переконуюсь, що я виконую простий запит БД, перш ніж відображати повідомлення "Доступно в додатку". Це також чудово підходить для пагоди та будь-якого іншого сонного господаря.
Яків Еван Шрев

8
@aubraus: Вашу редакцію відхилено ... У будь-якому разі: для всіх тих, хто сказав, що вона не працює: важлива частина моєї відповіді - "монітор доступності". Просто встановлення додатка не допоможе. Вам також потрібно налаштувати моніторинг доступності за допомогою URL-адреси програми heroku.
П’єр

13
У випадку, якщо хтось все ще шукає цього, пряме посилання для ping знаходиться тут: synthetics.newrelic.com/accounts/ evidenceyour_account_idSense/monitors/ new Просто вкажіть ідентифікатор вашого облікового запису.
Ерік Ян

91

В якості альтернативи Pingdom я пропоную спробувати Uptimerobot . Це безкоштовно і пропонує 5-хвилинну інтервальну перевірку сайту. Це дуже добре працює для мене.

ОНОВЛЕННЯ 7 травня 2015 року: Це вже не стане можливим, оскільки Heroku змінить своє вільне дино, щоб запобігти збереженню його в живих протягом 24 годин:

Ще одна важлива зміна стосується динотичного сну або «простою». Хоча додатки, які не платять, завжди спали після таймауту активності, деякі додатки використовували автоматичні послуги пінгінгу, щоб запобігти такій поведінці. безкоштовні диноси дозволяються прослуховувати 18 годин протягом 24 годин, і протягом наступних кількох тижнів ми почнемо сповіщати користувачів про додатки, які перевищують цю межу. З впровадженням хобі Dyno (7 доларів на місяць) ми просимо або дозволити вашій програмі спати після закінчення тайм-ауту, або перейти до цієї нової опції.

Коли це буде жити? Відповідно до їхнього блогу:

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


1
Uptimerobot, здається, (іронічно) вниз. Ви можете зареєструватися та увійти, але якщо ви спробуєте додати новий монітор, він просто говорить "монітор уже
Джефф Аксельрод

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

Я не зміг це зробити, оскільки Uptimerobot вимагає IP-адреси ?? Я не бачу, як змусити його працювати з URL-адресою, як, наприклад, herokuapp URL. EDIT: Моє погано, я вводив http://і отримував помилку.
Рубен Мартинес-молодший

1
Велика різниця - 5-хвилинний інтервал - це означає, що якщо ви не отримаєте сповіщення, пройдіть за 5 хвилин. Ми використовуємо пінгометр ( 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 запропонувати цей рівень для розробки / тестування без великих накладних витрат на постійно працюючі сервери.
drowe

29
Це також добре для "виробничого" сайту з низьким трафіком і без оплати клієнтів, яким ви не хочете чекати тридцять секунд, щоб перша сторінка завантажилася.
alxndr

2
Ви маєте рацію, але є багато поважних причин для запуску одного дина ... Такого, як мати єдиного координатора з певним станом у пам'яті ...
jonasfj

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

60

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


1
чи можливо видалити ваш herokuapp з вашої служби?
метеор

2
Він більше не приймає нові програми. Його сторінка GitHub містить кілька питань про це. Ця відповідь зараз може вважатися застарілою.
nickolay.laptev

45

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


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

2
Навіщо це робити щохвилини? Як ви бачите у відповіді @ newe1344, Героку спинає дино після години бездіяльності. Тож напевно пінінг кожні 59 хвилин є більш ефективним?
Darwin Tech

2
Він повідомляє, коли він знижений, тому хвилинна частота працює добре як для запобігання сну, так і для звітів про простої
Jesse Wolgamott

Я не думаю, що його (досі?) Безкоштовно.
rahulserver

@rahulserver - Ти маєш рацію, Pingdom більше не має безкоштовного акаунта.
Джон Леманн

40

Проста відповідь - якщо ви цінуєте послугу, тоді заплатите за неї.

Всі ці "хитрощі", щоб отримати переваги платної послуги ... ну, це по суті як крадіжка кабелю. Сумнівно навіть перераховувати їх тут. Що далі, хитрощі, як піратські ігри?

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


14
Це платна послуга з певними умовами. Чому б не оптимізувати ваше використання сервісу в ці терміни, щоб отримати максимальну користь від нього?
pkinsky

8
Добре, я вважаю, що я вже вказав причину, але, щоб сказати про це трохи далі - цільове використання безкоштовного хостингу зрозуміло. А перевага "завжди в нагоді" - це вигода платити навіть просто бездарність за другого працівника. Усі подвиги тут включають марно витрачаються ресурси, щоб звільнитися від оплати послуги. Це ганебна поведінка. Чому я повинен дбати? Тому що, якщо вони набридають, їхній заклик буде скасовувати безкоштовну послугу, яка, як задумано, для мене дуже цінує.
elc

2
Гаразд, щоб уточнити, як ви проїжджаєте по поворотних шляхах, він не запитує лише "Чи є спосіб обходу? він також запитує: "Чи повинен я платити ..." Ось що я відповідаю. Це більш фундаментальне питання. Впевнені, що існує безліч тривіально простих способів обійти. Вони етично помиляються, тому в кращому випадку марно витрачати час на їх деталізацію тут, і, мабуть, значно гірше, оскільки це сприяє і заохочує погану поведінку.
elc

4
Це трохи переборщило. Ми розгортаємось до heroku під час тестування. Коли наші клієнти відвідують сайт, коли він не працює, вони припускають, що з додатком, який ми розробили для підключення до сервісу, щось не так. Підтримувати сайт живим заради чутливості до демонстраційного додатку, який ніколи не побачить світло дня, навряд чи неетично. Звучить як особисте переконання, а не етика. Якщо це не порушує правила чи закон, ваша етична презумпція - це єдине, що неправильно . 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-адресу для ping (наприклад: http://spokenvote.org )
➜ Виберіть 1 хвилину для інтервалу


3
Дякую Пратіку. FYI, якщо ви коментуєте додаток щохвилини, ви будете використовувати пропускну здатність без будь-якої користі для роботи на холостому ходу. Якщо у вас немає іншої причини, це безпечно масштабувати цей зворотний штрих.
sscirrus

Дякую за пропозицію @sscirrus
Pratik Khadloya

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

Питання: Чи трапляється вам знати, де можна змінити цей інтервал пінгу? Здається, це не доступний варіант у налаштуваннях панелі інструментів.
mishap_n

4

Я знайшов ще один безкоштовний веб-сайт, який постійно пінг вашого сайту під назвою Unidler

http://unidler.herokuapp.com/

Те саме, що і pingdom, але не потрібно входити в систему.


Як видалити після додавання?
Lekr0

3

Зауважте, що нові типи dyno ( наразі бета-версія , що надходить у червні 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. Ваш веб-сайт може отримувати інші запити посеред ночі, прокидаючи дино і спричиняючи ще один час використання для кожного запиту. Навіть якщо ніхто більше не знає ваш домен, є боти та сканери, які постійно працюють. Тому доцільно встановити процес, визначений у вашій 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();
}
}


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.