Java Heroku应用程序即使在收到流量且未醒来时也处于休眠状态
我有一个应用程序(电报机器人实际上)部署到heroku使用网络dynos 我在heroku官方网站上找到了这些信息: 如果一个应用程序有一个免费的网络dyno,并且该dyno在30分钟内没有收到任何网络流量,它将休眠 如果睡眠中的网络动态用户接收到网络流量,它将在短时间延迟后再次激活(假设您的帐户有可用的动态用户时间) 但这种情况对我不起作用。我的应用程序只工作25-35分钟,进入“睡眠模式”,并且(!)不想醒来。只有Java Heroku应用程序即使在收到流量且未醒来时也处于休眠状态,java,heroku,telegram-bot,Java,Heroku,Telegram Bot,我有一个应用程序(电报机器人实际上)部署到heroku使用网络dynos 我在heroku官方网站上找到了这些信息: 如果一个应用程序有一个免费的网络dyno,并且该dyno在30分钟内没有收到任何网络流量,它将休眠 如果睡眠中的网络动态用户接收到网络流量,它将在短时间延迟后再次激活(假设您的帐户有可用的动态用户时间) 但这种情况对我不起作用。我的应用程序只工作25-35分钟,进入“睡眠模式”,并且(!)不想醒来。只有heroku restart有帮助 我是这样测试的: 启动应用程序 保持每5
heroku restart
有帮助
我是这样测试的:
- 启动应用程序
- 保持每5分钟向我的电报机器人发送一次消息(以便收到流量)
- 应用程序正在运行并保持响应
- 我陷入了应用程序停止响应的间隙
- 继续发送消息,但应用程序仍处于静默状态
Heroku日志——源应用程序
我可以在那里看到什么?几乎没有。没有错误,没有崩溃,成功记录了最后一条消息。另外,我的应用程序正在使用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一次谷歌的网页
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");
}
}
}
日志:
最后一次ping和休眠之间间隔3分钟
<> P>我认为Helku并不认为以上所有的行为都是Web流量。
我该怎么做才能让我的应用程序保持活力?我找到了解决方案
我有两个选择:
从LongPolling(getUpdates方法)切换到WebHook并配置控制器
重写我的ping任务服务
我选择了第二个选项,因为我不想重写我的机器人业务逻辑
我开始为heroku提供的应用程序ping url,而不是ping google。
https://example.herokuapp.com/
现在我的应用程序没有进入睡眠模式,因为每10分钟我都会“从我的应用程序向我的应用程序”发送请求.你使用的是哪种类型的dyno?web、worker还是一次性!这是免费dyno吗?就像我在帖子中说的:免费web dyno。我想这是因为我使用的是LongPolling机器人而不是WebHook机器人。LongPolling应该使用worker dyno,WebHook应该使用web dyno。我会试试。你找到这样的“解决方案”很好.但不幸的是,这是一种非常低效的方法,尤其是如果你使用免费的Heroku dynos。当你每10分钟ping一次你的应用程序时,你会消耗大量的免费dyno时间,最终,你会浪费掉所有的时间…请查看此()因此,如果你想在免费计划的范围内,我恳切地建议你切换到长池。
2020-07-03T14:46:47 [scheduling-1] ru.miroha.service.PingTaskService: Ping www.google.com, OK: response code 200