Cara mudah untuk mencegah Heroku idling?


285

Dalam aplikasi gratis Heroku, dino tampaknya tetap idle - aplikasi saya memiliki lalu lintas yang sangat rendah tetapi juga tidak dapat diterima dalam kasus saya bahwa pengguna saya harus menunggu lebih dari 20 detik untuk memutar dino baru.

Terus terang, dengan penantian semacam itu, banyak yang akan pergi sebelum halaman pertama ditampilkan.

Jadi, saya punya masalah: haruskah saya membayar $ 36 sebulan untuk menyelamatkan setiap pengguna selama 20 detik yang memalukan ketika lalu lintas saya dalam satu digit per hari.

Apakah ada jalan keluarnya ini ??


13
Pada 1 Juli 2015, ini tidak akan mungkin lagi, menurut pengumuman Heroku: blog.heroku.com/archives/2015/5/5/7/heroku-free-dynos . Namun mereka memperkenalkan rencana "hobi" yang harganya hanya $ 7 / bulan.
Cristian

1
Sekarang ada server virtual yang tersedia seharga $ 5 / bulan (atau kurang dari satu jam per jam) yang memberikan akses penuh ke shell dll. Saya telah menggunakan DigitalOcean selama lebih dari satu tahun sekarang tapi saya yakin ada orang lain di ruang untuk bersaing. IMO solusi yang lebih baik jika Heroku tidak lagi gratis ..
batu bata

1
@ batu bata VPS lengkap (yang perlu Anda kelola, terus diperbarui, konfigurasikan server Git, server web, server DB, firewall, kait Git, cadangan, WAL-E, dll, dll, dll.) adalah hal yang berbeda dari Heroku ( a PaaS). Dalam beberapa kasus Anda ingin yang pertama, yang lain yang terakhir, tetapi dolar mentah harus menjadi metrik utama. Waktu dan risiko seharusnya.
elithrar

Bagaimana cara menginstal agen Relic Baru pada aplikasi RoR? newrelic.com/ruby
Manny Quintanilla

1
Mulai 1 Juni 2016, ini dimungkinkan lagi jika Anda memverifikasi dengan kartu kredit. pengumuman . Anda akan mendapatkan 1000 jam gratis sebulan, dan hanya ada 730 jam dalam sebulan. Dengan asumsi Anda hanya memiliki satu dyno berjalan, Anda dapat pergi 24/7 gratis.
Baked Potato

Jawaban:


351

Anda dapat menginstal add-on New Relic gratis . Ini memiliki fitur monitor ketersediaan yang akan melakukan ping situs Anda dua kali per menit, sehingga mencegah dyno dari pemalasan.

Kurang lebih solusi yang sama dengan Jesse tetapi mungkin lebih terintegrasi ke Heroku ... Dan dengan beberapa fasilitas (pemantauan kinerja sangat bagus).

Pemantauan ketersediaan

Catatan: untuk semua yang mengatakan itu tidak berfungsi: bagian penting dalam jawaban saya adalah "ketersediaan monitor". Hanya menginstal addon tidak akan membantu. Anda juga perlu mengatur pemantauan ketersediaan dengan URL aplikasi heroku Anda.


6
apakah kita harus menginstal gem 'newrelic_rpm' juga untuk mencegah dyno dari idling?
Simo

3
Berapa ini meningkatkan penggunaan dyno?
Trevoke

4
Saya baru saja menemukan ini cukup baru. Ini tidak masih bekerja sangat baik. Tapi untuk berjaga-jaga, saya memastikan saya melakukan permintaan DB sederhana sebelum menampilkan pesan 'Aplikasi Tersedia'. Ini juga berfungsi baik dengan Pagoda, dan host mengantuk lainnya.
Jacob Evan Shreve

8
@ aubraus: hasil edit Anda ditolak ... Pokoknya: bagi semua yang mengatakan itu tidak berfungsi: bagian penting dalam jawaban saya adalah "ketersediaan monitor". Hanya menginstal addon tidak akan membantu. Anda juga perlu mengatur pemantauan ketersediaan dengan URL aplikasi heroku Anda.
Pierre

13
Jika ada yang masih mencari ini, tautan langsung untuk ping ada di sini: synthetics.newrelic.com/accounts/[your_account_id[/monitors/new Baru saja sub dalam ID akun Anda.
Eric Yang

91

Sebagai alternatif untuk Pingdom saya sarankan mencoba Uptimerobot . Ini gratis dan menawarkan pengecekan situs interval 5 menit. Ini bekerja dengan sangat baik untuk saya.

UPDATE 7 Mei 2015: Ini tidak akan mungkin lagi, karena Heroku akan mengubah dyno gratis mereka untuk mencegah tetap hidup selama 24 jam penuh:

Perubahan penting lainnya berkaitan dengan dyno sleep, atau 'idling'. Sementara aplikasi tidak berbayar selalu tidur setelah batas waktu aktivitas, beberapa aplikasi menggunakan layanan ping otomatis untuk mencegah perilaku itu. dyno gratis diperbolehkan 18 jam terjaga per periode 24 jam, dan selama beberapa minggu ke depan kami akan mulai memberi tahu pengguna aplikasi yang melebihi batas itu. Dengan diperkenalkannya hobi hobi ($ 7 per bulan), kami meminta untuk membiarkan aplikasi Anda tidur setelah waktu habis, atau meningkatkan ke opsi baru ini.

Kapan ini akan ditayangkan? Menurut posting blog mereka:

Aplikasi yang menjalankan 1X dyno tunggal yang tidak menumpuk biaya dyno lainnya akan dimigrasi secara bertahap ke dyno gratis baru mulai 1 Juli .


1
Uptimerobot tampaknya (ironisnya) turun. Anda dapat mendaftar dan masuk, tetapi jika Anda mencoba menambahkan monitor baru, itu hanya mengatakan "monitor
Jeff Axelrod

Tampaknya bekerja dengan adil, well ... Saya mengerti heroku tidur di layanan gratis, tapi itu menyebalkan ketika hosting koordinator pusat (yang oleh natur tidak dapat ditingkatkan).
jonasfj

Saya tidak dapat melakukan ini karena Uptimerobot memerlukan alamat IP ?? Saya tidak bisa melihat cara membuatnya bekerja dengan url, seperti url herokuapp. EDIT: Buruk saya, saya menempatkan di http://dan mendapatkan kesalahan.
Ruben Martinez Jr.

1
Perbedaan besar adalah interval 5 menit berarti itu akan menjadi 5 menit sebelum Anda diberitahu jika turun. Kami menggunakan Pingometer ( pingometer.com ) yang memiliki interval 1 menit dan sangat bagus dengan Heroku.
okoboko

9
Pada April 2017, batas 18 jam hilang, Anda dapat memiliki dyno gratis hingga 24/7, asalkan akun Anda diverifikasi. devcenter-staging.heroku.com/articles/free-dyno-hour-faq .
bagonyi

76

Menurut pendapat saya, menggunakan tingkat layanan 'gratis' tidak boleh menyalakan produksi atau aplikasi yang dihadapi pelanggan. Sementara solusi di atas bekerja melawan idola Dyno, pikirkan baik-baik tentang apa yang Anda lakukan.

Jika tidak ada yang lain, gunakan pekerjaan cron untuk melakukan ping ke situs Anda, dan nonaktifkan pemeriksaan untuk periode penggunaan rendah yang diketahui (yaitu, semalam) untuk memastikan Heroku tidak menghapus tier gratis untuk orang lain.


Terima kasih atas jawaban anda. Apa yang Anda maksudkan secara spesifik dengan 'berpikir secara matang tentang apa yang Anda lakukan'?
sscirrus

36
Sebagian besar untuk orang yang membaca jawaban di atas untuk solusi ini. Tujuan dari tingkat gratis di Heroku bukan untuk meng-host aplikasi produksi yang perlu tersedia untuk pelanggan. Free tier idling memungkinkan Heroku menawarkan level ini untuk pengembangan / pengujian, tanpa biaya overhead yang besar dari server yang terus berjalan.
drowe

29
Ini juga baik untuk situs "produksi" dengan lalu lintas rendah dan tidak ada pelanggan yang membayar, yang Anda tidak ingin menunggu tiga puluh detik untuk memuat halaman pertama.
alxndr

2
Anda benar, tetapi ada banyak alasan yang sah untuk hanya menjalankan satu dino ... Seperti memiliki koordinator tunggal dengan beberapa status dalam memori ...
jonasfj

17
Anda tidak tahu banyak tentang aplikasinya jadi saya pikir komentar Anda cukup menghakimi.
wobbily_col

60

Anda juga dapat mencoba http://kaffeine.herokuapp.com (dibuat oleh saya), itu dibuat untuk mencegah aplikasi Heroku tertidur. Ini akan melakukan ping aplikasi Anda setiap 10 menit sehingga aplikasi Anda tidak akan tidur. Ini sepenuhnya gratis.


1
apakah mungkin untuk menghapus herokuapp Anda dari layanan Anda?
meteor

2
Itu tidak menerima aplikasi baru lagi. Halaman GitHub-nya berisi beberapa masalah tentang itu. Jawaban ini dapat dianggap sudah usang sekarang.
nickolay.laptev

45

Anda dapat menggunakan http://pingdom.com/ untuk memeriksa aplikasi Anda; jika dilakukan setiap menit, heroku tidak akan menganggur aplikasi Anda dan tidak perlu spin-up.


2
Sangat sulit untuk memutuskan antara dua jawaban! Pada akhirnya saya pergi dengan Newrelic karena saya sudah punya akun di sana. Terima kasih banyak atas saran hebat ini - itu benar-benar menyelesaikan masalah saya juga. :) +1.
sscirrus

2
Mengapa melakukannya setiap menit? Seperti yang Anda lihat di jawaban @ newe1344, Heroku memutar dyno setelah satu jam tidak aktif. Jadi pastinya menyematkan setiap 59 menit lebih efektif?
Darwin Tech

2
Ini melaporkan ketika turun, sehingga frekuensi menit bekerja dengan baik untuk mencegah tidur, dan melaporkan downtime
Jesse Wolgamott

Saya tidak berpikir itu (masih?) Gratis.
rahulserver

@rahulserver - Anda benar, Pingdom tidak lagi memiliki akun gratis.
John Lehmann

40

Jawaban mudah - jika Anda menghargai layanannya maka bayarlah.

Semua 'trik' ini untuk mendapatkan manfaat layanan berbayar ... yah itu pada dasarnya seperti mencuri kabel. Dipertanyakan untuk mendaftar di sini. Apa selanjutnya, trik bagaimana cara membajak game?

Seperti poster lain di sini, saya menghargai layanan gratis untuk pengembangan dan pengujian dan saya akan sangat terganggu pada semua jenis gangguan etika Anda jika Heroku tidak melakukannya karena ada terlalu banyak freeloaders. Saya hanya tidak berpikir dia cukup langsung dalam kritiknya.


14
Ini layanan berbayar, dengan persyaratan tertentu. Mengapa tidak mengoptimalkan penggunaan layanan Anda dalam persyaratan tersebut untuk mendapatkan hasil maksimal dari itu?
pkinsky

8
Yah saya percaya saya sudah menunjukkan alasannya, tetapi untuk menjabarkannya sedikit lebih jauh - maksud penggunaan hosting gratis jelas. Dan keuntungan dari 'selalu aktif' adalah keuntungan membayar bahkan hanya dengan sedikit sekali upah untuk pekerja kedua. Semua eksploitasi di sini melibatkan sumber daya yang tidak berguna untuk keluar dari membayar layanan. Itu adalah perilaku yang memalukan. Kenapa aku harus peduli? Karena jika mereka muak, jalan keluar mereka adalah menghapuskan layanan gratis yang, seperti yang dimaksudkan, sangat berharga bagiku.
elc

2
Oke hanya untuk mengklarifikasi untuk Anda drive-by downvoters, dia tidak hanya bertanya "Apakah ada jalan lain?" dia juga bertanya "Haruskah saya membayar ..." Inilah yang saya jawab. Ini adalah pertanyaan yang lebih mendasar. Tentu ada banyak cara mudah untuk mem-bypass. Mereka secara etis salah, jadi sebaiknya buang waktu untuk memerinci mereka di sini, dan bisa dibilang jauh lebih buruk karena merupakan memungkinkan dan mendorong perilaku buruk.
elc

4
Itu sedikit keterlaluan. Kami menyebarkan ke heroku saat pengujian. Ketika pelanggan kami pergi ke situs saat tidak digunakan, mereka menganggap ada sesuatu yang salah dengan aplikasi yang kami kembangkan untuk terhubung ke layanan. Menjaga situs agar tetap hidup demi responsif terhadap demo aplikasi yang mungkin tidak pernah melihat hari yang cerah hampir tidak etis. Kedengarannya seperti keyakinan pribadi, bukan etika. Jika tidak melanggar aturan atau hukum, anggapan etis Anda adalah satu-satunya hal yang salah . Freemium adalah model bisnis yang sah. Tidak apa-apa untuk "mengambil keuntungan" dari bagian bebas dari itu. Itu sudah diharapkan.
Matt Long

1
Jadi pembenaran Anda adalah "semua orang melakukannya" Itu bukan argumen baru. Atau yang meyakinkan. sunting Maaf Anda membuat poin yang valid untuk beberapa orang. Bahwa apa yang dilakukan tidak dilarang secara eksplisit sehingga tidak salah. Saya tahu ada orang yang percaya 'apa yang tidak secara tegas dilarang diizinkan' dan lebih jauh mengatakan bahwa itu tidak hanya diizinkan tetapi 'tidak salah'. Seluruh sikap itu adalah apa yang saya sebut pelampauan dengan cara melayani diri sendiri. Tetapi hal itu mengarah pada perbedaan filosofis yang mendasar.
elc

30

Diuji dan bekerja pada aplikasi Heroku saya sendiri menggunakan Node.js 0.10.x pada 6/28/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
Dalam pandangan saya solusi terbaik, karena tidak bergantung pada layanan pihak ketiga. Terima kasih :)
electronix384128

Tampaknya itu tidak menghindari tidur. Tetapi berfungsi untuk secara otomatis naik lagi. Saya tidak tahu apakah perilaku ini karena perubahan, sebenarnya solusi Anda berasal dari hampir dua tahun yang lalu.
jgato

20

Saya menggunakan addon Penjadwal Heroku yang disediakan oleh Heroku secara gratis. Setelah ditambahkan, ini sederhana seperti menciptakan pekerjaan dengan 'curl http://yourapp.herokuapp.com ' dan interval 10 menit.


11

Dikatakan dalam dokumentasi Heroku bahwa memiliki lebih dari 1 web dyno tidak akan pernah berhenti Mungkin solusi yang lebih murah daripada $ 0,09 / jam seperti yang disarankan Pierre.

masukkan deskripsi gambar di sini

Dokumentasi


6
Add-on Heroku memiliki versi standar gratis.
sscirrus

9

Saya telah menuliskan langkah-langkahnya:

➜ Tambahkan gem 'newrelic_rpm' ke Gemfile Anda di bawah pementasan & produksi
➜ bundel instal
➜ Login ke panel kontrol heroku dan tambahkan addel newrelic ➜
Setelah ditambahkan, siapkan ping otomatis ke situs web Anda agar tidak menganggur
➜ Telusuri ke Menu> Pemantauan Ketersediaan ( di bawah Pengaturan) → Klik “Aktifkan Pemantauan Ketersediaan”
➜ Masukkan url ke ping (mis .: http://spokenvote.org )
➜ Pilih 1 menit untuk interval


3
Terima kasih, Pratik. FYI jika Anda melakukan ping aplikasi Anda setiap menit, Anda akan menggunakan bandwidth tanpa manfaat untuk pemalasan. Kecuali Anda memiliki alasan lain, aman untuk mengurangi sentuhan itu.
sscirrus

Terima kasih atas saran @sscirrus
Pratik Khadloya

3
Heroku hanya akan menempatkan dyno Anda untuk tidur setelah 1 jam tidak aktif, sehingga Anda dapat mengukur interval kembali ke 1 jam (atau mungkin 50 menit untuk berada di sisi yang aman).
David Underwood

Pertanyaan: Apakah Anda tahu di mana harus mengubah interval ping itu? Tampaknya bukan opsi yang tersedia di pengaturan dasbor.
mishap_n


3

Perhatikan bahwa jenis dyno baru ( saat ini dalam versi beta , masuk pada Juni 2015) akan melarang untuk membuat dyno gratis terbangun 24/7, karena harus tidur setidaknya 6 jam per hari.

Jadi cobalah untuk menghapus solusi apa pun yang Anda temukan di utas ini sebelum keluar (atau bayar untuk layanan yang sebenarnya Anda gunakan).


3

Jika Anda memiliki akses ke server unix yang selalu aktif, Anda dapat mengatur tugas cron ke GETsitus web Anda. Di bawah ketentuan baru paket gratis ini, Anda mungkin ingin menonaktifkannya GETdi malam hari, menggunakan garis di crontab Anda seperti ini:

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

Ini menginstruksikan curlke GETdomain.com setiap 20 menit antara jam 8 dan 22.

Sadarilah itu

  1. Tidak semua orang yang ingin melihat situs web Anda hidup di zona waktu Anda dan
  2. Situs Anda dapat menerima permintaan lain di tengah malam, membangunkan dyno Anda dan menyebabkan satu jam waktu penggunaan untuk setiap permintaan. Bahkan jika tidak ada orang lain yang tahu domain Anda, ada bot dan crawler yang aktif setiap saat. Oleh karena itu, disarankan untuk mengatur proses yang didefinisikan dalam crontab Anda agar hanya aktif selama 14 hingga 16 jam untuk menyediakan penyangga terhadap bangun ini

Juga, pastikan waktu sistem Anda diatur dengan benar sehingga jendela down-time terjadi saat Anda mengharapkannya.


3

Sebagian besar jawaban di sini sudah usang atau saat ini tidak berfungsi. Tingkat gratis saat ini untuk akun pribadi diberikan basis 550 jam dino gratis setiap bulan.

Dan akun gratis terverifikasi memberi Anda 1000 jam dyno gratis. Saya menulis artikel tentang bagaimana saya membuat aplikasi gratis saya tetap terjaga.

https://link.medium.com/uDHrk5HAD0

Semoga ini bisa membantu siapa saja yang membutuhkan solusi di 2019


2

ini berfungsi untuk saya dalam aplikasi pegas yang membuat satu permintaan http setiap 2 menit ke jalur url root `

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

Ingat konfigurasi konteks Anda untuk mengaktifkan penjadwal dan membuat kacang untuk penjadwal Anda

@EnableScheduling
public class AppConfig {

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


1

Saya memiliki aplikasi yang hanya perlu dijalankan dari Senin hingga Jumat sekitar jam makan siang. Saya baru saja menambahkan skrip berikut ke crontab di tempat kerja:

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

Jadi untuk aplikasi apa pun cukup masukkan baris lain di crontab Anda seperti:

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

1

Saya pikir perbaikan termudah untuk ini adalah dengan melakukan ping sendiri ke server Anda sendiri setiap 30 menit. Berikut kode yang saya gunakan dalam proyek node.js saya untuk mencegah tidur.

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

Satu lagi solusi yang berfungsi: wokeDyno Berikut ini adalah posting blog cara kerjanya: Ini terintegrasi dalam aplikasi sangat mudah:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.