Heroku rölantisini önlemenin kolay yolu?


286

Heroku ücretsiz uygulamalarında dinamolar boşta kalıyor gibi görünüyor - uygulamamın trafiği çok düşük, ancak benim durumumda, kullanıcılarımın yeni bir dinamoyu döndürmek için 20+ saniye beklemesi gerekmiyor.

Açıkçası, bu tür bir beklemeyle, çoğu ilk sayfa görüntülenmeden önce ayrılacaktır.

Yani, bir sorunum var: trafiğim günde tek haneli olduğunda her kullanıcıyı utanç verici bir şekilde 20 saniye kurtarmak için ayda 36 $ ödeyecek miyim.

Bunun etrafında bir yol var mı ??


13
Heroku'nun açıklamasına göre, 1 Temmuz 2015 itibariyle bu mümkün olmayacak: blog.heroku.com/archives/2015/5/7/heroku-free-dynos . Ancak ayda sadece $ 7 olan bir "hobi" planı sundular.
Cristian

1
Şu anda tam kabuk erişimi vb. Sağlayan 5 $ / ay (veya daha az saatlik faturalandırma) için sanal sunucular mevcut olabilir. Heroku artık özgür değilse IMO daha iyi bir çözüm ..
15:42

1
sricks Tam bir VPS (yönetmeniz, güncel tutmanız, bir Git sunucusu, web sunucusu, DB sunucusu, güvenlik duvarı, Git kancaları, yedeklemeler, WAL-E vb. vb.) yapılandırmanız gerekir, Heroku'dan ( a PaaS). Bazı durumlarda birincisini, bazılarında ikincisini istersiniz, ancak ham dolar birincil bir metrik olmalıdır. Zaman ve risk olmalı.
elithrar

RoR uygulamasına Yeni Relic ajanı nasıl kurulur? newrelic.com/ruby
Manny Quintanilla

1
1 Haziran 2016 itibarıyla, kredi kartıyla doğrulama yaparsanız bu tekrar mümkündür. duyuru . Ayda 1000 ücretsiz saat alırsınız ve ayda sadece 730 saat vardır. Sadece bir dyno'nun çalıştığını varsayarsak, 7/24 ücretsiz olarak gidebilirsiniz.
Fırında Patates

Yanıtlar:


352

Ücretsiz New Relic eklentisini yükleyebilirsiniz . Sitenizi dakikada iki kez pingleyecek ve böylece dyno'nun boşta çalışmasını önleyecek bir kullanılabilirlik izleme özelliğine sahiptir.

Jesse ile hemen hemen aynı çözüm ama belki Heroku ile daha entegre ... Ve birkaç avantajla (performans izleme sadece harika).

Kullanılabilirlik izleme

Not: işe yaramadığını söyleyen herkese: cevabımın önemli kısmı "kullanılabilirlik izleme" dir. Sadece addon'u yüklemek yardımcı olmaz. Ayrıca, heroku uygulamanızın URL'si ile kullanılabilirlik izlemeyi ayarlamanız gerekir.


6
dyno'nun rölantide çalışmasını önlemek için gem 'newrelic_rpm' yi de yüklememiz gerekir mi?
simo

3
Bu, dyno kullanımını ne kadar artırır?
Trevoke

4
Bunu kısa bir süre önce keşfettim. Bu mu hala mükemmel işliyor. Yine de, 'Uygulama Kullanılabilir' iletisini görüntülemeden önce basit bir DB sorgusu yaptığımdan eminim. Bu da Pagoda ve diğer uykulu ev sahibi ile harika çalışıyor.
Jacob Evan Shreve

8
@aubraus: düzenlemeniz reddedildi ... Her neyse: işe yaramadığını söyleyen herkese: cevabımın önemli kısmı "kullanılabilirlik izleme". Sadece addon'u yüklemek yardımcı olmaz. Ayrıca, heroku uygulamanızın URL'si ile kullanılabilirlik izlemeyi ayarlamanız gerekir.
Pierre

13
Birinin hala bunu araması durumunda, ping için doğrudan bağlantı burada: synthetics.newrelic.com/accounts/[your_account_id Cialis/monitors/new Hesap kimliğinizde sadece alt.
Eric Yang

91

Pingdom'a alternatif olarak Uptimerobot'u denemenizi öneririm . Ücretsizdir ve 5 dakikalık aralıklarla saha kontrolü sunar. Benim için çok iyi çalışıyor.

7 Mayıs 2015 GÜNCELLEME: Heroku tam 24 saat boyunca hayatta kalmasını önlemek için ücretsiz dinamolarını değiştireceğinden , bu artık mümkün olmayacak :

Bir diğer önemli değişiklik dinamo uyku veya 'rölanti' ile ilgilidir. Ücretli olmayan uygulamalar bir etkinlik zaman aşımından sonra her zaman uyurken, bazı uygulamalar bu davranışı önlemek için otomatik pinging hizmetleri kullanmıştır. 24 saat boyunca 18 saat uyanık ücretsiz dinamolara izin verilir ve önümüzdeki birkaç hafta içinde bu sınırı aşan uygulamaları kullanıcılara bildirmeye başlayacağız. Hobi dinamosunun (aylık 7 $) piyasaya sürülmesiyle, uygulamanızın zaman aşımından sonra uykuya dalmasını veya bu yeni seçeneğe geçmenizi istiyoruz.

Bu ne zaman canlı olacak? Blog gönderilerine göre:

Başka bir dyno ücreti biriktirmeyen tek bir 1X dyno çalıştıran uygulamalar, 1 Temmuz'dan itibaren yavaş yavaş yeni ücretsiz dynos'a geçirilecektir .


1
Uptimerobot (ironik olarak) aşağı görünüyor. Kaydolabilir ve giriş yapabilirsiniz, ancak yeni bir monitör eklemeye çalışırsanız, "zaten monitör
Jeff Axelrod

Adil çalışıyor gibi görünüyor, iyi ... Heroku'nun ücretsiz hizmetlerde bir şeyler uyuduğunu anlıyorum, ancak merkezi bir koordinatöre (doğal olarak ölçeklenemez) ev sahipliği yaparken berbat.
jonasfj

Uptimerobot bir IP adresi gerektirir gibi bunu başaramadı? Bir herokuapp url'si gibi bir url ile nasıl çalışacağını göremiyorum. EDIT: Benim kötü, ben koyarak http://ve bir hata alıyordu.
Ruben Martinez Jr.10

1
En büyük fark 5 dakikalık aralıklarla, bildirilirse bildirim almanızın 5 dakika süreceği anlamına gelir. 1 dakikalık aralıklarla Pingometre ( pingometer.com ) kullanıyoruz ve Heroku ile harikaydı.
okoboko

9
Nisan 2017 itibarı ile 18 saatlik limit sona erdi, hesabınızın doğrulanması koşuluyla ücretsiz dyno'nuzu 7/24 yükseltebilirsiniz. devcenter-staging.heroku.com/articles/free-dyno-hour-faq .
bagonyi

76

Kanımca, hizmetin 'ücretsiz' katmanını kullanmak bir üretime veya müşteriye dönük bir uygulamaya güç vermemelidir. Yukarıdaki çözümler Dyno rölantisine karşı çalışırken, ne yaptığınızı iyice düşünün.

Başka bir şey yoksa, sitenize ping atmak için bir cron işi kullanın ve Heroku'nun herkes için ücretsiz katmandan kaçınmamasını sağlamak için bilinen düşük kullanım dönemlerini (yani bir gecede) kontrol etmeyi devre dışı bırakın.


Cevabınız için teşekkürler. Özellikle 'ne yaptığınızı iyice düşünün' ile ne demek istersiniz?
sscirrus

36
Büyük ölçüde bu çözüm için yukarıdaki cevapları okuyan insanlar için. Heroku'daki ücretsiz seviyenin amacı, müşteriler için mevcut olması gereken bir üretim uygulamasına ev sahipliği yapmak değildir. Ücretsiz kademeli rölanti, Heroku'nun sürekli çalışan sunucular için yüksek bir maliyet olmadan geliştirme / test için bu seviyeyi sunmasına izin verir.
drowe

29
Ayrıca, ilk trafiğin yüklenmesi için otuz saniye beklemek istemediğiniz, trafiği düşük ve ödeme yapmayan müşterileri olmayan bir "üretim" sitesi için de uygundur.
alxndr

2
Haklısın, ama sadece bir dinamoyu çalıştırmak için birçok geçerli neden var ... Hafızada bazı durumları olan tek bir koordinatöre sahip olmak gibi ...
jonasfj

17
Onun uygulaması hakkında çok şey bilmiyorum, bu yüzden yorumunuz oldukça yargılayıcı olduğunu düşünüyorum.
wobbily_col

60

Ayrıca deneyebilirsiniz http://kaffeine.herokuapp.com (made by me), bu Heroku uyumaya apps önlemek için yapılmış. Uygulamanız uyku moduna geçmeyecek şekilde 10 dakikada bir ping uygular. Tamamen ücretsiz.


1
Herokuapp'ınızı hizmetinizden kaldırmak mümkün mü?
meteor

2
Artık yeni uygulamaları kabul etmiyor. GitHub sayfası bununla ilgili birkaç sorun içeriyor. Bu cevap şimdi kullanılmıyor olarak kabul edilebilir.
nickolay.laptev

45

Uygulamanızı kontrol etmek için http://pingdom.com/ adresini kullanabilirsiniz ; her dakika yapılırsa, heroku uygulamanızı boşta bırakmayacak ve dönmeye gerek duymayacaktır.


2
İki cevap arasında karar vermek çok zor! Sonunda Newrelic ile gittim çünkü orada zaten bir hesabım var. Bu harika öneri için çok teşekkürler - aslında benim sorunumu da çözdü. :) +1.
sscirrus

2
Neden her dakika? @ Newe1344'ün cevabında görebileceğiniz gibi, Heroku bir saat hareketsiz kaldıktan sonra dinamoyu döndürüyor. Yani her 59 dakikada bir pining daha etkilidir?
Darwin Teknoloji

2

Ben (hala?) Özgür olduğunu sanmıyorum.
rahulserver

@rahulserver - Haklısın, Pingdom artık ücretsiz bir hesaba sahip değil.
John Lehmann

40

Kolay cevap - hizmete değer verirseniz, bunun için ödeme yapın.

Tüm bu 'hileler' ücretli hizmetten yararlanmak için ... aslında kablo çalmak gibi. Bunları burada listelemek bile şüphelidir. Sırada ne var, korsan oyunlarının nasıl yapılacağıyla ilgili püf noktaları

Buradaki başka bir poster gibi, geliştirme ve test için ücretsiz hizmete değer veriyorum ve Heroku bunu ortadan kaldırırsa çok fazla serbest yükleyici olduğu için etik engelli türlerin hepsinden çok rahatsız olacağım. Eleştirisinde yeterince doğrudan olduğunu düşünmüyorum.


14
Belirli şartlarla ücretli bir hizmettir. Neden hizmetten en iyi şekilde yararlanmak için hizmeti bu terimler dahilinde optimize etmiyorsunuz?
pkinsky

8
Ben zaten nedenini belirtti, ama biraz daha heceleyerek inanıyorum - ücretsiz hosting amaçlanan kullanımı açıktır. Ve 'her zaman açık''ın avantajı, ikinci bir işçi için bile sadece bir miktar ödeme yapmaktır. Buradaki tüm istismarlar, bir hizmet için para ödemekten kurtulmak için gereksiz yere kaynak tüketmeyi içerir. Utanç verici bir davranıştır. Neden umursayayım? Çünkü bıkarlarsa, rızaları, amaçlandığı gibi kullanılan ücretsiz hizmetten kurtulmak benim için çok değerli olacaktır.
elc

2
Tamam, senin için aşağı inenler tarafından açıklığa kavuşturmak için, sadece "Etrafında bir yol var mı?" o da "Ödeme yapmalı mıyım ..." diye soruyor. Bu daha temel bir soru. Tabii ki bypass etmenin tonlarca kolay yolu var. Etik olarak yanlıştırlar, bu yüzden onları burada detaylandırmak en iyisidir ve kötü davranışı mümkün kılan ve teşvik ettiği için tartışmasız oldukça daha kötüdür.
elc

4
Bu biraz fazla uzanıyor. Test ederken heroku'ya konuşlandırıyoruz. Müşterilerimiz boşta kaldığında siteye gittiklerinde, hizmete bağlanmak için geliştirdiğimiz uygulamada bir sorun olduğunu varsayarlar. Gün ışığı görmeyecek bir uygulamayı demo olarak yanıtlamak için siteyi canlı tutmak pek etik değildir. Kulağa etik değil kişisel bir inanç gibi geliyor. Kurallara veya yasalara aykırı değilse, tek şey etik varsayımınız yanlıştır . Freemium meşru bir iş modelidir. Bunun bedava kısmından "faydalanmak" sorun değil. Bekleniyor.
Matt Long

1
Bu yüzden gerekçeniz "herkes yapıyor" Bu gerçekten yeni bir argüman değil. Ya da ikna edici. düzenlemek Üzgünüz, bazı insanlar için geçerli bir noktaya gel. Yapılmakta olanın açıkça yasaklanmadığı için yanlış değildir. 'Açıkça yasaklanmayan şeylere izin verildiğine' inanan insanlar olduğunu biliyorum ve sadece izin verildiğini değil, 'yanlış' olduğunu söylemeyi daha da ileri götürdüm. Bütün bu tavır aşırı kendine tepmeyi çok kendine hizmet eden bir şekilde etiketleyeceğim şeydi. Ancak temel bir felsefi farklılığa dönüşüyor.
elc

30

28.06.2013 tarihinde Node.js 0.10.x kullanarak kendi Heroku uygulamam üzerinde test edildi ve çalışıyor

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
Bence en iyi çözüm, çünkü herhangi bir üçüncü taraf hizmetine dayanmıyor. Teşekkürler :)
electronix384128

Görünüşe göre uyumaktan kaçınmıyor. Ancak otomatik olarak tekrar yukarı çıkmak için çalışır. Bu davranışın değişikliklerden kaynaklanıp kaynaklanmadığını bilmiyorum, aslında çözüm neredeyse iki yıl önce geliyor.
jgato

20

Heroku tarafından sağlanan Heroku Zamanlayıcı eklentisini ücretsiz kullanıyorum. Bir kez eklendi 'curl http://yourapp.herokuapp.com ' ve 10 dakikalık bir aralık ile bir iş oluşturmak gibi basit .


11

Heroku belgelerinde 1'den fazla web dinamosuna sahip olmanın asla boşta olmayacağını söylüyor. Pierre'in önerdiği gibi, muhtemelen 0.09 $ / saatten daha ucuz bir çözüm.

resim açıklamasını buraya girin

belgeleme


6
Heroku eklentisinin ücretsiz bir standart sürümü vardır.
sscirrus

9

Adımları yazdım:

Sta Evreleme ve üretim altında Gemfile'nıza gem 'newrelic_rpm' ekleyin
➜ paket yükleme
hero Heroku kontrol paneline giriş yapın ve newrelic addon ekleyin added Eklendikten
sonra, boşta kalmaması için web sitenize otomatik pingleme ayarlayın
➜ Menü> Kullanılabilirlik İzleme ( Ayarlar altında) → “Kullanılabilirlik İzlemeyi Aç” a tıklayın
➜ Ping yapılacak URL'yi girin (örn: http://spokenvote.org )
➜ Aralık için 1 dakika seçin


3
Teşekkürler Pratik. FYI, uygulamanıza her dakika ping uygularsanız, rölantide herhangi bir fayda olmadan bant genişliğini kullanırsınız. Başka bir nedeniniz yoksa, bir dokunuşu geri ölçeklendirmek güvenli.
sscirrus

Öneri için teşekkürler @sscirrus
Pratik Khadloya

3
Heroku, dyno'nuzu sadece 1 saatlik işlem yapılmadığında uykuya geçirir, böylece aralığı 1 saate (veya güvenli tarafta olmak için 50 dakika) geri ölçeklendirebilirsiniz.
David Underwood

Soru: Bu ping aralığını nerede değiştireceğinizi biliyor musunuz? Gösterge tablosu ayarlarında kullanılabilir bir seçenek gibi görünmüyor.
mishap_n


3

Yeni dyno türlerinin ( şu anda beta sürümündedir) , Haziran 2015'te geliyor), günde en az 6 saat uyumak zorunda kalacağı için ücretsiz bir dynoyu 7/24 uyandırmayı yasaklayacağını unutmayın.

Bu yüzden, bu konu ortaya çıkmadan önce (veya gerçekten kullandığınız hizmet için ödeme yapmadan önce) bu konuyu bulduğunuz tüm çözümleri kaldırmayı deneyin.


3

Her zaman açık olan bir unix sunucusuna erişiminiz varsa GET, web sitenize bir cron işi ayarlayabilirsiniz . Ücretsiz planın yeni şartları altında, muhtemelen GETcrontab'ınızdaki böyle bir satırı kullanarak gece saatlerinde s'yi devre dışı bırakmak isteyeceksiniz :

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

Bu curl,GET , 8 ve 22 saatleri arasında 20 dakikada bir domain.com'a .

Farkında olmak

  1. Web sitenizi görmek isteyen herkes saat diliminizde yaşamıyor ve
  2. Siteniz gece yarısı başka dinler de alabilir, dinamoyu uyandırabilir ve her istek için bir saatlik kullanım süresine neden olabilir. Alan adınızı hiç kimse bilmese bile, sürekli etkin botlar ve tarayıcılar vardır. Bu nedenle, bu uyandırmalara karşı bir tampon sağlamak için crontab'ınızda tanımlanan sürecin sadece 14 ila 16 saat boyunca aktif olarak ayarlanması tavsiye edilir

Ayrıca, kapalı kalma süresinin beklediğiniz zaman gerçekleşmesi için sistem saatinizin doğru ayarlandığından emin olun.


3

Buradaki cevapların çoğu eski veya şu anda çalışmıyor. Kişisel hesaplar için mevcut ücretsiz katman, her ay 550 ücretsiz dyno saati baz almaktadır .

Doğrulanmış ücretsiz bir hesap size 1000 saatlik ücretsiz dinamo verir. Ücretsiz uygulamamın nasıl uyanık kaldığına dair bir makale yazdım.

https://link.medium.com/uDHrk5HAD0

Umarım 2019'da bir çözüme ihtiyacı olan herkese yardımcı olur


2

Bu uygulama benim için bir bahar uygulamasında kök URL yoluna her 2 dakikada bir http isteği yapıyor '

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

Bağlayıcıyı zamanlayıcıyı etkinleştirecek şekilde yapılandırmayı ve zamanlayıcı için çekirdeği oluşturmayı unutma

@EnableScheduling
public class AppConfig {

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


1

Ben sadece pazartesiden cumaya öğle vakti çalışması gereken bir uygulama var. İş yerinde crontab'a şu komut dosyasını ekledim:

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

Yani herhangi bir uygulama için crontab'ınızda başka bir satır bırakın:

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

1

Bunun en kolay çözüm, kendi sunucunuza her 30 dakikada bir ping yapmak olduğunu düşünüyorum. İşte uyku önlemek için node.js projemde kullandığım kod.

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

Bir çalışma çözümü daha: wokeDyno İşte nasıl çalıştığı bir blog yazısı : Uygulamaya çok kolay entegre edilmiştir:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.