在Heroku免费应用程序中,测功机似乎一直处于闲置状态-我的应用程序的流量非常低,但在我的情况下,我的用户必须等待20秒钟以上才能启动新的测功机,这也不能令人满意。
坦白说,经过这样的等待,许多人甚至在首页显示之前就离开了。
因此,我有一个问题:当我的流量每天达到一位数字时,我应该每月支付36美元来为每个用户节省20秒钟的尴尬时间吗。
有没有解决的办法??
在Heroku免费应用程序中,测功机似乎一直处于闲置状态-我的应用程序的流量非常低,但在我的情况下,我的用户必须等待20秒钟以上才能启动新的测功机,这也不能令人满意。
坦白说,经过这样的等待,许多人甚至在首页显示之前就离开了。
因此,我有一个问题:当我的流量每天达到一位数字时,我应该每月支付36美元来为每个用户节省20秒钟的尴尬时间吗。
有没有解决的办法??
Answers:
您可以安装免费的New Relic附加组件。它具有可用性监视器功能,它将每分钟对您的站点执行一次ping操作,从而防止dyno空转。
与Jesse大致相同的解决方案,但可能更多地集成到了Heroku中……而且还有一些好处(性能监控非常棒)。
注意:所有人都认为这是行不通的:我回答的重要部分是“可用性监视器”。仅安装插件将无济于事。您还需要使用heroku应用程序的URL设置可用性监视。
作为Pingdom的替代方案,我建议尝试Uptimerobot。它是免费的,并提供5分钟间隔的站点检查。对我来说很好。
2015年5月7日更新:这将不再可能,因为Heroku会更改其免费测功机,以使其保持24小时不间断运行:
另一个重要的变化与动态睡眠或“空转”有关。虽然非付费应用程序总是在活动超时后进入睡眠状态,但某些应用程序使用自动ping服务来防止这种行为。每24小时允许免费唤醒功能唤醒18小时,在接下来的几周内,我们将开始通知用户超过该限制的应用程序。随着爱好动态功能的推出(每月7美元),我们要求要么让您的应用在超时后进入睡眠状态,要么升级到此新选项。
这什么时候上线?根据他们的博客文章:
从7月1日开始,运行一次1X测功的应用程序将逐渐迁移到新的免费测功上。
http://
并得到一个错误。
我认为,使用“免费”服务层不应为生产或面向客户的应用程序提供动力。尽管上述解决方案可防止Dyno空转,但请仔细考虑您的工作。
如果没有其他要求,请使用cron作业对您的网站执行ping操作,并在已知的低使用期限(即整夜)中禁用检查,以确保Heroku不会为其他所有人取消免费套餐。
您也可以尝试http://kaffeine.herokuapp.com(由我制造),它是为防止Heroku应用程序进入睡眠状态而设计的。它将每隔10分钟对您的应用执行ping操作,以使您的应用不会进入睡眠状态。它是完全免费的。
您可以使用http://pingdom.com/查看您的应用;如果每分钟左右完成一次,heroku不会闲置您的应用程序,也不需要加速。
简单的答案-如果您重视服务,然后付费。
所有这些“技巧”都是为了获得付费服务的好处……嗯,这本质上就像是在偷电缆。甚至在这里列出它们都值得怀疑。接下来,如何盗版游戏的技巧?
就像这里的另一张海报一样,我非常重视免费的开发和测试服务,如果Heroku放弃了它,因为有太多的免费下载程序,那么我将非常烦恼你们所有道德受损的类型。我只是认为他的批评不够直接。
在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();
我免费使用Heroku提供的Heroku Scheduler插件。添加后,创建带有“ curl http://yourapp.herokuapp.com ”和10分钟间隔的作业非常简单。
我写下了步骤:
st在登台和生产下将gem'newrelic_rpm'添加到您的Gemfile中
➜捆绑安装
➜登录heroku控制面板并添加newrelic插件
➜添加后,将自动ping设置到您的网站,以使其不会闲置
➜浏览到菜单>可用性监控(在设置下)→单击“打开可用性监控”
➜输入要ping的网址(例如:http : //spokenvote.org)
➜选择1分钟作为间隔
如果您可以访问始终打开的Unix服务器,则可以将cron作业设置为GET
您的网站。根据免费计划的新条款,您可能希望GET
在夜间使用crontab中的一行禁用s,如下所示:
*/20 8-22 * * * /usr/bin/curl domain.com &> /dev/null
这指示在8点到22点之间每20分钟curl
访问GET
一次domain.com。
意识到
另外,请确保正确设置系统时间,以使停机时间窗口在您期望的时间发生。
这里的大多数答案已经过时或目前无法正常工作。当前的个人帐户免费套餐每月提供550个免费动态小时基础。
一个经过验证的免费帐户可为您提供1000个小时的免费测功机。我写了一篇有关如何使我的免费应用保持清醒状态的文章。
https://link.medium.com/uDHrk5HAD0
希望它可以帮助2019年需要解决方案的任何人
这在春季应用程序中为我工作,每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();
}
}
伙计们,这是一个heroku应用程序,您可以运行该应用程序以使多个heroku应用程序保持活动状态。只需在config.json中添加要ping的网址即可。
我有一个只需要在周一至周五午餐时间运行的应用程序。我只是在工作中将以下脚本添加到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
我认为最简单的解决方法是每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
另一个可行的解决方案:wokeDyno 这是一篇博客文章,其工作方式:非常容易地将其集成到应用程序中:
/* 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
});
计划工作会做。参见https://cron-job.org。它是免费且可靠的。