简单的方法来防止Heroku闲置?
在Heroku免费应用程序中,dynos似乎保持闲置状态 – 我的应用程序的stream量非常低,但在我的情况下,我的用户不得不等待20多秒才能启动一个新的dyno。
坦率地说,有了这样的等待,很多人会在第一页显示之前离开。
所以,我有一个问题:当我的stream量是每天一位数的时候,我是否应该每月支付36美元来为每个用户节省20秒的令人尴尬的时间。
有没有解决的办法??
您可以安装免费的New Relic附加组件 。 它有一个可用性监视器function,将每分钟ping你的网站两次,从而防止空转的dynamic。
或多或less与杰西相同的解决scheme,但也许更多地集成到Heroku中…并且有一些额外的好处(性能监控非常棒)。
注意:对于所有那些说不起作用的人来说:我的答案中的重要部分是“可用性监视器”。 只要安装插件将无济于事。 您还需要使用您的heroku应用程序的URL设置可用性监控。
作为Pingdom的替代品,我build议尝试Uptimerobot 。 它是免费的,并提供5分钟的时间间隔现场检查。 它对我来说工作得很好。
更新2015年5月7日:这将不再可能,因为Heroku将改变他们的免费testing,以防止它保持活着24小时:
另一个重要的变化是与睡觉,或“空转”有关。 尽pipe非付费应用在活动超时后总是睡眠,但某些应用使用自动ping服务来防止这种行为。 免费的dynos允许每24小时清醒18小时,在接下来的几周内,我们将开始通知用户超出限制的应用程序。 随着业余爱好者的介绍(每月7美元),我们要求让应用程序在超时后hibernate,或升级到这个新的选项。
这是什么时候生活? 根据他们的博客文章:
运行单个1X测功机的应用程序不会累积任何其他的测功机费用,将从7月1日起逐渐迁移到新的免费testing版。
在我看来,使用服务的“免费”层级不应该是面向生产或面向客户的应用程序。 虽然上面的解决scheme对Dyno怠速工作,但仔细想想你在做什么。
如果没有别的,使用cron作业来ping您的站点,并禁用已知的低使用期(即隔夜)的检查,以确保Heroku不会免除其他人的免费套餐。
你也可以尝试http://kaffeine.herokuapp.com ,这是为了防止Heroku的应用程序进入睡眠。 它会每隔10分钟就会ping您的应用程序,这样您的应用程序就不会进入睡眠状态 这是完全免费的。
您可以使用http://pingdom.com/来检查您的应用程序;; 如果每分钟左右完成一次,Heroku不会让你的应用程序空闲,也不需要旋转。
简单的答案 – 如果你重视服务,然后付钱。
所有这些“技巧”,以获得有偿服务的好处…以及它本质上就像偷电缆。 可疑甚至在这里列出他们。 接下来的什么是如何欺骗游戏的技巧?
就像另一张海报一样,我非常重视开发和testing的免费服务,如果Heroku因为有太多的freeloader而抛弃它,我会对所有的道德障碍types感到非常恼火。 我只是觉得他的批评不够直接。
在6/28/2013上使用Node.js 0.10.x进行testing并使用我自己的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文件中说,有超过1个networkingtesting仪将永远不会闲置。 皮埃尔认为,可能是比0.09美元/小时更便宜的解决scheme。
文档
我已经写下了几个步骤:
➜在分段和生产阶段将gem'newrelic_rpm'添加到你的Gemfile中
捆绑安装
➜login到heroku控制面板,并添加新的插件
➜一旦添加,设置自动ping到您的网站,使其不闲置
➜浏览到菜单>可用性监控(在设置下)→点击“打开可用性监控”
➜inputurl来ping(例如: http : //spokenvote.org )
➜select间隔1分钟
我使用Heroku提供的Heroku Scheduler插件。 一旦添加它很简单,因为创build一个'curlhttp://yourapp.herokuapp.com '的工作和10分钟的时间间隔。
请注意,新的测功机types( 目前处于testing阶段 ,2015年6月即将到来)将不允许每天24小时保持免费的测功机,因为它必须每天至less睡6个小时。
因此,尝试删除在此线程中find的任何解决scheme(或支付您实际使用的服务)。
这个工作对于我来说,在一个春季应用程序中,每2分钟向一个http urlpath发一个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); } }
请记住configuration您的上下文以启用调度程序并为您的调度程序创buildbean
@EnableScheduling public class AppConfig { @Bean public HerokuNotIdle herokuNotIdle(){ return new HerokuNotIdle(); } }
如果您有权访问始终处于运行状态的unix服务器,则可以设置一个cron作业来GET
您的网站。 在免费计划的新条款下,您可能希望在夜晚使用crontab中的一行来禁用GET
,如下所示:
*/20 8-22 * * * /usr/bin/curl domain.com &> /dev/null
这指示curl
从8到22小时之间每20分钟GET
域名.com。
意识到
- 不是每个想看你的网站的人都住在你的时区和地区
- 您的网站可能会在半夜收到其他请求,唤醒您的dynamic码,并为每个请求再次使用一小时的时间。 即使没有其他人知道您的域名,也会有一直处于活动状态的漫游器和爬虫。 因此,build议您将crontab中定义的进程设置为活动状态,时间仅为14到16小时,以便为这些唤醒提供缓冲
此外,请确保您的系统时间设置正确,以便在您期望的时间发生停机时间窗口。
家伙,这里是一个heroku应用程序,你可以运行,以保持多个heroku应用程序的活着。 只需在config.json中添加你想要ping的url即可。
我有一个应用程序,只需要从周一到周五在午餐时间运行。 我刚刚在工作中将以下脚本添加到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