我有一个使用Web dynos部署到heroku的应用程序(实际上是Tele Bot)。
我在heroku官方网站上找到了以下信息:
如果应用具有免费的网络测功机,并且该测功机在30分钟内未收到任何网络流量,则它将休眠。
如果处于休眠状态的网络测功机收到网络流量,则在短暂的延迟后(假设您的帐户有可用的免费测功机时间),它将再次变为活动状态
但是这种情况对我不起作用。我的应用程序仅工作25-35分钟,并进入“睡眠模式”,并且(!)不想唤醒。只有heroku restart
有帮助。
我像这样测试它:
此后,我进入了Heroku仪表板,发现该应用程序处于“睡眠模式”(带有zzz图标)。好的,让我们检查日志heroku logs --source app
。
我在那里可以看到什么?几乎没有。没有错误,没有崩溃,成功记录了最后一条消息。另外我的应用程序正在使用MongoDB,最后一条日志消息是:
2020-07-03T14:49:20 [extShutdownHook] org.mongodb.driver.connection: Closed connection [
connectionId{localValue:4, serverValue:129573}] to botcluster-shard-00-01-aeqgg.mongodb.net:27017 because the pool has been closed.
因此在应用程序停止之前,我与数据库的连接已关闭。
此外,我决定编写服务类,该类将每5分钟ping通Google的网页。
public class PingTaskService {
@Value("${pingtask.url}")
private String url;
@Scheduled(fixedRateString = "${pingtask.period}")
public void keepAlive() {
try {
URL url = new URL(getUrl());
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
connection.disconnect();
log.info("Ping {}, OK: response code {}", url.getHost(), connection.getResponseCode());
} catch (IOException e) {
log.error("Ping FAILED");
}
}
}
日志:
2020-07-03T14:46:47 [scheduling-1] ru.miroha.service.PingTaskService: Ping www.google.com, OK: response code 200
从上次ping到休眠之间3分钟。
我得出结论,heroku不会将上述所有操作都视为网络流量。
我应该怎么做才能使我的应用程序继续运行?
答案 0 :(得分:1)
我找到了解决方法。
我有2个选择:
我选择第二个选项是因为不想重写我的机器人业务逻辑。
我没有对google进行ping操作,而是开始对heroku提供的应用的ping url。
https://example.herokuapp.com/
现在,我的应用程序不会进入睡眠模式,因为我每隔10分钟就会发送一次请求“从我的应用程序到我的应用程序”。