在Heroku免费应用程序中,dynos似乎保持闲置 - 我的应用程序的流量非常低,但在我的情况下我的用户不得不等待20多秒才能启动新的dyno。
坦率地说,有了这种等待,许多人会在第一页显示之前离开。所以,我有一个问题:当我的流量是每天一位数时,我应该每个月支付36美元来为每个用户节省一个令人尴尬的长20秒。
有没有办法解决这个问题?
答案 0 :(得分:344)
您可以安装免费的New Relic add-on。它具有可用性监视器功能,可以每分钟对您的站点执行两次ping操作,从而防止dyno空闲。
与Jesse或多或少相同的解决方案,但可能更多地集成到Heroku ......并且有一些额外的好处(性能监控非常棒)。
注意:对所有说它不起作用的人:我的答案中的重要部分是“可用性监视器”。只是安装插件无济于事。您还需要使用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)
答案 9 :(得分:9)
我写下了以下步骤:
➜将宝石'newrelic_rpm'添加到您的Gemfile下的staging&生产
➜捆绑安装
➜登录heroku控制面板并添加新的插件
➜添加后,设置自动ping到您的网站,以便它不会闲置
➜浏览菜单>可用性监控(在“设置”下
→单击“打开可用性监视”
➜输入要ping的网址(例如:http://spokenvote.org)
➜为间隔选择1分钟
答案 10 :(得分:3)
答案 11 :(得分:3)
如果您可以访问始终处于启动状态的unix服务器,则可以将cron作业设置为GET
您的网站。根据免费计划的新条款,您可能希望在夜晚使用crontab中的一行禁用GET
,如下所示:
*/20 8-22 * * * /usr/bin/curl domain.com &> /dev/null
这会在8到22小时之间每隔20分钟向curl
{} {} {}指示{。}}。
请注意
此外,请确保您的系统时间设置正确,以便在您预期的时候发生停机时间窗口。
答案 12 :(得分:3)
请注意,新的dyno类型(currently in beta,即2015年6月传入)将禁止每周7天每天24小时不停地唤醒,因为它必须每天至少睡6小时。
因此,尝试删除此线程中找到的任何解决方案(或支付您实际使用的服务)。
答案 13 :(得分:1)
将执行cron工作。参见https://cron-job.org。它是免费且可靠的。
答案 14 :(得分:1)
答案 15 :(得分:1)
Guy,这是一个heroku应用程序,您可以运行以保持多个heroku应用程序活着。只需在config.json中添加要ping的URL即可。
答案 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全天候运行。