web-dev-qa-db-ja.com

Herokuのアイドリングを防ぐ簡単な方法は?

Herokuの無料アプリでは、dynosはアイドリングを続けているようです-私のアプリのトラフィックは非常に少ないですが、私の場合、ユーザーが新しいdynoを起動するまで20秒以上待たなければならないこともあまり受け入れられません。

率直に言って、その種の待ち時間で、多くの人は最初のページが表示される前に去ります。

だから、私は問題があります:私のトラフィックが1桁1桁である場合に、各ユーザーに20秒という非常に長い時間を節約するために、月に36ドル支払う必要があります。

これを回避する方法はありますか??

271
sscirrus

無料の New Relicアドオン をインストールできます。サイトに1分間に2回pingを実行する可用性モニター機能があり、dynoのアイドリングを防ぎます。

多かれ少なかれJesseと同じソリューションですが、Herokuにより統合される可能性があります...そして、いくつかの特典があります(パフォーマンスの監視は素晴らしいです)。

Availability monitoring

注:それが機能しないと言っているすべての人へ:私の答えの重要な部分は「可用性モニター」です。アドオンをインストールするだけでは役に立ちません。また、herokuアプリのURLを使用して可用性監視を設定する必要があります。

344
Pierre

Pingdomの代替として、 ptimerobot を試すことをお勧めします。無料で、5分間隔のサイトチェックを提供します。それは私にとって非常にうまく機能します。

2015年5月7日更新:Herokuは無料のdynoを変更します 24時間生き続けることを防ぐため、これはもはや不可能です:

もう1つの重要な変更は、ダイノスリープまたは「アイドル」に関連しています。有料アプリはアクティビティタイムアウト後に常にスリープしますが、一部のアプリは自動pingサービスを使用してその動作を防ぎます。無料のdynoは24時間ごとに18時間起床できます。今後数週間にわたって、その制限を超えるアプリをユーザーに通知し始めます。趣味のダイノ(月額7ドル)の導入により、タイムアウト後にアプリをスリープ状態にするか、この新しいオプションにアップグレードするように求めています。

これはいつ公開されますか?彼らのブログ投稿によると:

他のdynoチャージを蓄積しない単一の1X dynoを実行するアプリケーションは、7月1日から始まる新しい無料dynoに徐々に移行されます

89
Cristian

私の意見では、サービスの「無料」層を使用することで、実稼働アプリケーションや顧客向けアプリケーションに電力を供給すべきではありません。上記のソリューションはDynoのアイドリングに対して機能しますが、何をしているのかを徹底的に考えてください。

それ以外の場合は、cronジョブを使用してサイトをpingし、既知の低使用期間(夜間など)のチェックを無効にして、Herokuが他のすべてのユーザーの無料利用枠を廃止しないようにします。

73
drowe

http://kaffeine.herokuapp.com (私が作った)を試すこともできます。Herokuアプリがスリープ状態になるのを防ぐために作られています。 10分ごとにアプリにpingが送信されるため、アプリはスリープ状態になりません。完全に無料です。

56
Romain

http://pingdom.com/ を使用してアプリを確認できます。 1分ごとに完了すると、herokuはアプリをアイドル状態にせず、スピンアップする必要がなくなります。

45
Jesse Wolgamott

簡単な答え-サービスを評価してから料金を支払う場合。

有料サービスのメリットを得るためのこれらすべての「トリック」...それは基本的にケーブルを盗むようなものです。ここにそれらをリストすることさえ疑わしい。次に、ゲームを海賊版にする方法の秘trickは何ですか?

ここの別のポスターのように、私は開発とテストのための無料サービスを高く評価しています。フリーローダーが多すぎるためにHerokuがこれをやめた場合、倫理に障害のあるすべてのタイプに非常に悩まされます。私は彼が彼の批判で十分に直接的だったとは思わない。

38
elc

6/28/2013にNode.js 0.10.xを使用して自分のHerokuアプリでテストおよび作業

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();
27
DubbyTT

Herokuが無料で提供するHeroku Schedulerアドオンを使用します。追加すると、「curl http://yourapp.herokuapp.com 」で10分間隔でジョブを作成するので簡単です。

17
Jordan

Herokuのドキュメントでは、複数のweb dynoがアイドル状態になることはないと述べています。 Pierreが提案するように、おそらく0.09ドル/時間よりも安価なソリューションです。

enter image description here

ドキュメント

10
newshorts

手順を書き留めました。

gemステージングとプロダクションでGemfileにgem 'newrelic_rpm'を追加します
➜バンドルインストール
➜herokuコントロールパネルにログインし、newrelicアドオンを追加します
➜追加したら、アイドル状態にならないようにWebサイトに自動pingを設定します
➜メニュー>可用性監視([設定]の下)を参照→[可用性監視を有効にする]をクリック
➜pingするURLを入力します(例: http://spokenvote.org
➜間隔に1分を選択します

9
Pratik Khadloya

あなたのサイトに絶えずpingを送信するUnidlerという別の無料サイトを見つけました

http://unidler.herokuapp.com/

Pingdomと同じですが、ログインする必要はありません。

3
sonnyhe2002

新しいdynoタイプ( 現在ベータ版 、2015年6月に着信)は、1日あたり少なくとも6時間スリープする必要があるため、24時間365日無料で目覚めたdynoを保持することを禁止します。

したがって、このスレッドが見つかる前に、このスレッドで見つけた解決策をすべて削除してみてください(または実際に使用したサービスの料金を支払います)。

3
aymericbeaumet

常に稼働しているUNIXサーバーにアクセスできる場合は、cronジョブをWebサイトのGETに設定できます。無料プランの新しい条件では、おそらく次のようなcrontabの行を使用して、夜間にGETsを無効にすることをお勧めします。

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

これは、8時から22時までの20分ごとにcurlGET domain.comに指示します。

を注意

  1. あなたのウェブサイトを見たい人全員があなたのタイムゾーンに住んでいるわけではなく、
  2. サイトは深夜に他のリクエストを受信し、dynoを起動して、各リクエストにさらに1時間の使用時間を要する場合があります。ドメインを誰も知らない場合でも、常にアクティブなボットとクローラーが存在します。したがって、crontabで定義されたプロセスを14〜16時間だけアクティブに設定して、これらのウェイクアップに対するバッファを提供することをお勧めします

また、ダウンタイムウィンドウが予想どおりに発生するように、システム時間が適切に設定されていることを確認してください。

3
drs

ガイ、これは複数のherokuアプリを維持するために実行できるherokuアプリです。 config.jsonでpingするURLを追加するだけです。

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

1
ReadyBird

これは、春のアプリケーションで2分ごとに1つのhttpリクエストをルート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);
}
}

コンテキストを設定してスケジューラを有効にし、スケジューラのBeanを作成することを忘れないでください

@EnableScheduling
public class AppConfig {

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

私は、ランチタイム前後に月曜日から金曜日まで実行するだけのアプリを持っています。仕事中の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
0