Heroku在第一次请求或重新唤醒时超时

时间:2014-04-02 06:58:12

标签: ruby-on-rails backbone.js heroku ruby-on-rails-4 asset-pipeline

我有一个正常运行的Rails 4.1应用程序,还有一个页面/app,可以作为Backbone + Marionette的单页Web应用程序。

当我推送到Heroku时,我的应用程序将在所有页面上正常运行,直到我访问/app页面(加载Backbone环境),此时应用程序将超时。任何设备的后续请求都可以正常工作。然而,如果dyno进入睡眠状态,重新唤醒之后的第一个请求也会超时。

我认为这与资产预编译有关,但我不清楚为什么资产在dyno进入睡眠状态时会过期。

大约有50个js文件,编译时大约300kb。

此问题是否存在已知问题或解决方法?

2 个答案:

答案 0 :(得分:1)

我的第一直觉告诉我你有一个只有一个dyno的免费等级heroku应用程序。在一小时不活动后,你的dyno会进入睡眠状态。为了再次唤醒它,路由器发送的第一个请求会有一些延迟。

可能是你的/ app路径很重,第一次加载需要很长时间。与缓存几乎相同。当你有一个繁重的请求时,它需要花费大量的时间来处理它,但是那些缓存其中的内容非常快。

我找不到关于资产管道的任何确认,但如果后续请求运行得很好,我可以想象睡眠工作者是主要原因。也许你应该实施一个小的rake任务,防止你的工人闲置。例如,如果每55分钟执行一次任务,那么您的工作人员将永远不会再次入睡。

答案 1 :(得分:0)

我能想到的最好的解决方法是use a CDN用于您的资产,这会通过从另一个系统(通常是S3)请求您的资产来消除您的应用对Heroku服务器的依赖性CloudFront的)

如果你想要

,我可以详细说明如何做到这一点

其次,正如@Rails4Guides.com所提到的,你应该知道Heroku免费等级的限制是让你的dyno在一小时不活动后进入睡眠状态。这是为了保持750 hour free limit for AWS instances(Heroku建立起来)

要解决此问题,您需要invest in another Dyno ($35/mo),或者如上所述,运行一项小任务,每小时对您的应用进行一次ping操作(保持您的dyno正常运行)