即使收到流量但未唤醒,Heroku应用程序仍处于睡眠状态

时间:2020-07-04 09:07:55

标签: java heroku telegram-bot

我有一个使用Web dynos部署到heroku的应用程序(实际上是Tele Bot)。

我在heroku官方网站上找到了以下信息:

如果应用具有免费的网络测功机,并且该测功机在30分钟内未收到任何网络流量,则它将休眠。

如果处于休眠状态的网络测功机收到网络流量,则在短暂的延迟后(假设您的帐户有可用的免费测功机时间),它将再次变为活动状态

但是这种情况对我不起作用。我的应用程序仅工作25-35分钟,并进入“睡眠模式”,并且(!)不想唤醒。只有heroku restart有帮助。

我像这样测试它:

  • 启动应用
  • 保持每5分钟向我的Telegram机器人发送消息(以确保流量进入)
  • 应用程序正在运行并保持响应
  • 我陷入了应用程序停止响应的空白
  • 继续发送消息,但应用程序仍然保持沉默

此后,我进入了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不会将上述所有操作都视为网络流量。

我应该怎么做才能使我的应用程序继续运行?

1 个答案:

答案 0 :(得分:1)

我找到了解决方法。

我有2个选择:

  1. 从LongPolling(getUpdates方法)切换到WebHook并配置Controller。
  2. 重写我的ping任务服务。

我选择第二个选项是因为不想重写我的机器人业务逻辑。

我没有对google进行ping操作,而是开始对heroku提供的应用的ping url。 https://example.herokuapp.com/ 现在,我的应用程序不会进入睡眠模式,因为我每隔10分钟就会发送一次请求“从我的应用程序到我的应用程序”。