在Heroku的免费应用程序中,dyno似乎一直在空转——我的应用程序流量很低,但在我的情况下,我的用户不得不等待20多秒才能启动一个新的dyno,这也是不能接受的。
坦率地说,在这样的等待下,许多人甚至在第一页显示之前就离开了。
所以,我遇到了一个问题:当我每天的流量都在个位数时,我是否应该每月支付36美元来为每个用户节省令人尴尬的漫长20秒?
有没有办法解决这个问题?
在Heroku的免费应用程序中,dyno似乎一直在空转——我的应用程序流量很低,但在我的情况下,我的用户不得不等待20多秒才能启动一个新的dyno,这也是不能接受的。
坦率地说,在这样的等待下,许多人甚至在第一页显示之前就离开了。
所以,我遇到了一个问题:当我每天的流量都在个位数时,我是否应该每月支付36美元来为每个用户节省令人尴尬的漫长20秒?
有没有办法解决这个问题?
当前回答
如果你有unix服务器的访问权限,你可以设置一个cron作业来获取你的网站。根据免费计划的新条款,您可能希望在夜间禁用get,使用crontab中的一行,如下所示:
*/20 8-22 * * * /usr/bin/curl domain.com &> /dev/null
这指示curl在8点到22点之间每20分钟GET domain.com一次。
请注意
不是每个想看你网站的人都生活在你的时区 您的站点可能会在半夜接收其他请求,从而唤醒您的dyno,并为每个请求增加一个小时的使用时间。即使没有人知道你的域名,也有机器人和爬虫一直在活动。因此,建议将crontab中定义的进程设置为仅活动14到16小时,以提供对这些唤醒的缓冲
另外,确保您的系统时间设置正确,以便停机时间窗口在您期望的时间发生。
其他回答
一份cron工作就可以了。见https://cron-job.org。它是免费和可靠的。
使用Node.js 0.10在我自己的Heroku应用上进行了测试和工作。X在2013年6月28日
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();
你可以使用http://pingdom.com/来检查你的应用;如果每分钟左右执行一次,heroku将不会闲置你的应用程序,也不需要旋转。
在一个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();
}
}
你可以安装免费的New Relic插件。它有一个可用性监控功能,每分钟会ping你的站点两次,从而防止dyno空转。
或多或少与Jesse的解决方案相同,但可能与Heroku更融合…而且还有一些额外的功能(性能监控非常棒)。
注意:对于所有那些说它不起作用的人:我的答案中重要的部分是“可用性监视器”。仅仅安装插件是没有用的。您还需要使用heroku应用程序的URL设置可用性监视。