简单的方法来防止Heroku空转?

时间:2011-03-29 23:52:11

标签: heroku

在Heroku免费应用程序中,dynos似乎保持闲置 - 我的应用程序的流量非常低,但在我的情况下我的用户不得不等待20多秒才能启动新的dyno。

坦率地说,有了这种等待,许多人会在第一页显示之前离开。

所以,我有一个问题:当我的流量是每天一位数时,我应该每个月支付36美元来为每个用户节省一个令人尴尬的长20秒。

有没有办法解决这个问题?

23 个答案:

答案 0 :(得分:344)

您可以安装免费的New Relic add-on。它具有可用性监视器功能,可以每分钟对您的站点执行两次ping操作,从而防止dyno空闲。

与Jesse或多或少相同的解决方案,但可能更多地集成到Heroku ......并且有一些额外的好处(性能监控非常棒)。

Availability monitoring

  

注意:对所有说它不起作用的人:我的答案中的重要部分是“可用性监视器”。只是安装插件无济于事。您还需要使用heroku应用程序的URL设置可用性监视。

答案 1 :(得分:89)

作为Pingdom的替代方案,我建议尝试Uptimerobot。它是免费的,并提供5分钟的间隔现场检查。它对我来说非常好。

2015年5月7日更新:这将不再可能,因为Heroku will change their free dyno可以防止它在24小时内保持活着状态:

  

另一个重要的变化与dyno睡眠或“空转”有关。虽然非付费应用程序在活动超时后总是睡觉,但某些应用程序使用自动ping服务来防止这种行为。免费dynos允许每24小时醒来18小时,在接下来的几周内,我们将开始通知用户超过该限制的应用程序。随着爱好dyno(每月7美元)的推出,我们要求让你的应用程序在超时后休眠,或升级到这个新选项。

这什么时候开始?根据他们的博客文章:

  

运行单个1X dyno的应用程序不会累积任何其他   dyno指控将逐渐迁移到新的免费dynos   从 7月1日开始

答案 2 :(得分:73)

在我看来,使用服务的“免费”层不应该为生产或面向客户的应用程序提供动力。虽然上述解决方案可以对抗Dyno闲置,但请仔细考虑您正在做的事情。

如果没有别的,请使用cron作业ping您的站点,并禁用对已知低使用期(即隔夜)的检查,以确保Heroku不会取消其他人的免费套餐。

答案 3 :(得分:56)

你也可以尝试http://kaffeine.herokuapp.com(由我制作),这是为了防止Heroku应用程序进入睡眠状态。它会每隔10分钟ping您的应用程序,以便您的应用程序不会进入睡眠状态。它是完全免费的。

答案 4 :(得分:45)

您可以使用http://pingdom.com/检查您的应用;如果每分钟左右完成,heroku将不会闲置你的应用程序,也不需要旋转。

答案 5 :(得分:38)

简单回答 - 如果您重视服务,那么付费。

所有这些“技巧”都可以获得付费服务的好处......好吧,它基本上就像窃取电缆一样。甚至可以在这里列出它们。接下来是什么,如何盗版游戏?

就像这里的另一张海报一样,我非常重视开发和测试的免费服务,如果Heroku不使用它,我将非常恼火于所有道德障碍类型,因为有太多的贪图者。我只是觉得他的批评不够直接。

答案 6 :(得分:27)

在2013年6月28日使用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();

答案 7 :(得分:17)

我免费使用Heroku提供的Heroku Scheduler插件。添加后,创建一个“curl http://yourapp.herokuapp.com”并且间隔为10分钟的作业非常简单。

答案 8 :(得分:10)

它在Heroku文档中说,拥有超过1个web dyno永远不会空出来。可能比皮埃尔建议的每小时0.09美元更便宜的解决方案。

enter image description here

Documentation

答案 9 :(得分:9)

我写下了以下步骤:

➜将宝石'newrelic_rpm'添加到您的Gemfile下的staging&生产
➜捆绑安装
➜登录heroku控制面板并添加新的插件
➜添加后,设置自动ping到您的网站,以便它不会闲置
➜浏览菜单>可用性监控(在“设置”下 →单击“打开可用性监视”
➜输入要ping的网址(例如:http://spokenvote.org
➜为间隔选择1分钟

答案 10 :(得分:3)

我发现了另一个免费网站,它将不断ping你的网站,名为Unidler

http://unidler.herokuapp.com/

与pingdom相同,但不需要登录。

答案 11 :(得分:3)

如果您可以访问始终处于启动状态的unix服务器,则可以将cron作业设置为GET您的网站。根据免费计划的新条款,您可能希望在夜晚使用crontab中的一行禁用GET,如下所示:

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

这会在8到22小时之间每隔20分钟向curl {} {} {}指示{。}}。

请注意

  1. 并非所有想要查看您网站的人都在您的时区和
  2. 您的网站可能会在半夜收到其他请求,唤醒您的dyno并为每个请求腾出一小时的使用时间。即使没有其他人知道您的域名,也会有机器人和抓取工具一直处于活动状态。因此,建议将crontab中定义的进程设置为仅激活14到16个小时,以便为这些唤醒提供缓冲区
  3. 此外,请确保您的系统时间设置正确,以便在您预期的时候发生停机时间窗口。

答案 12 :(得分:3)

请注意,新的dyno类型(currently in beta,即2015年6月传入)将禁止每周7天每天24小时不停地唤醒,因为它必须每天至少睡6小时。

因此,尝试删除此线程中找到的任何解决方案(或支付您实际使用的服务)。

答案 13 :(得分:1)

将执行cron工作。参见https://cron-job.org。它是免费且可靠的。

答案 14 :(得分:1)

将您应用的网址添加到http://kaffeine.herokuapp.com/

从站点上:

Kaffeine每30分钟对您的Heroku应用执行一次ping操作,使其永远不会进入睡眠状态*

Kaffeine pings your Heroku app every 30 mins so it will never go to sleep

答案 15 :(得分:1)

Guy,这是一个heroku应用程序,您可以运行以保持多个heroku应用程序活着。只需在config.json中添加要ping的URL即可。

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

答案 16 :(得分:1)

另一个可行的解决方案:wokeDyno blog post的工作方式如下: 它很容易集成到应用程序中:

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

答案 17 :(得分:1)

这里的大多数答案已经过时或目前无法正常工作。 heroku当前的免费等级为您提供550小时的免费dyno访问。一个经过验证的免费帐户可为您提供1000个小时的免费dyno。我写了一篇有关如何使我的免费应用保持清醒状态的文章。

https://link.medium.com/uDHrk5HAD0

希望它可以帮助2019年需要解决方案的任何人

答案 18 :(得分:1)

这项工作对我来说是一个spring应用程序,每2分钟向根URL路径发出一个http请求 `

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

答案 19 :(得分:0)

我认为最简单的解决方法是每30分钟自动ping您自己的服务器。 这是我在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

答案 20 :(得分:0)

我有一个应用程序,只需要在午餐时间从星期一到星期五运行。 我刚刚在工作中的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

答案 21 :(得分:0)

这是我的解决方法。

使用Google Apps脚本,并设置时间触发器。

// main.js
function ping() {
  UrlFetchApp.fetch("https://<Your app>.herokuapp.com/ping_from_GAS");
}

这很容易!

答案 22 :(得分:0)

Freshping是另一个免费资源,可以使您的免费Heroku应用保持24/7全天候运行。