在Heroku的免费应用程序中,dyno似乎一直在空转——我的应用程序流量很低,但在我的情况下,我的用户不得不等待20多秒才能启动一个新的dyno,这也是不能接受的。
坦率地说,在这样的等待下,许多人甚至在第一页显示之前就离开了。
所以,我遇到了一个问题:当我每天的流量都在个位数时,我是否应该每月支付36美元来为每个用户节省令人尴尬的漫长20秒?
有没有办法解决这个问题?
在Heroku的免费应用程序中,dyno似乎一直在空转——我的应用程序流量很低,但在我的情况下,我的用户不得不等待20多秒才能启动一个新的dyno,这也是不能接受的。
坦率地说,在这样的等待下,许多人甚至在第一页显示之前就离开了。
所以,我遇到了一个问题:当我每天的流量都在个位数时,我是否应该每月支付36美元来为每个用户节省令人尴尬的漫长20秒?
有没有办法解决这个问题?
当前回答
如果你正在使用带有express的nodejs,你可以添加一个每10分钟调用一次自己的端点。
路由器:
app.get("/keep-alive",require("path/to/keepAlive.js").keepAlive);
keepAlive.js
let interval;
function keepAlive(req, res) {
if(interval) return res.end();
interval = setInterval(() => {
fetch("http://your-heroku-subdomain/keep-alive")
.catch(err => {/*handle error here*/});
}
,60_000);
return res.end();
}
module.exports = { keepAlive }
其他回答
在我看来,使用服务的“免费”层不应该为产品或面向客户的应用程序提供动力。虽然上面的解决方案可以防止Dyno空转,但请仔细考虑您正在做的事情。
如果没有其他方法,可以使用cron作业来ping你的站点,并在已知的低使用率时期(例如,夜间)禁用检查,以确保Heroku不会为其他所有人取消免费层。
作为Pingdom的替代方案,我建议尝试Uptimerobot。它是免费的,并提供5分钟间隔的现场检查。这对我来说很好。
2015年5月7日更新:这将是不可能的,因为Heroku将改变他们的免费动态,以防止保持完整的24小时。
另一个重要的变化与动态睡眠或“空转”有关。虽然非付费应用总是在活动超时后休眠,但一些应用使用自动ping服务来防止这种行为。免费的dynos允许在24小时内保持18小时的清醒状态,在接下来的几周内,我们将开始通知用户超过这一限制的应用程序。随着爱好dyno的引入(每月7美元),我们要求你的应用在超时后休眠,或者升级到这个新选项。
什么时候能直播?根据他们的博客文章:
运行单个1X动态的应用程序不会累积任何其他动态 动态电荷将逐渐迁移到新的自由动态电荷 7月1日开始。
我认为最简单的解决方法是每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
如果你有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小时,以提供对这些唤醒的缓冲
另外,确保您的系统时间设置正确,以便停机时间窗口在您期望的时间发生。
我有一个只需要在周一到周五午餐时间运行的应用程序。 我刚刚在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