【问题标题】:Heroku timeout on first request or on re-awakeningHeroku 在第一次请求或重新唤醒时超时
【发布时间】:2014-04-02 06:58:12
【问题描述】:

我有一个运行正常的 Rails 4.1 应用程序,还有一个页面 /app,它充当带有 Backbone + Marionette 的单页 Web 应用程序。

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

我认为这与资产预编译有关,但我不清楚为什么如果测功机进入休眠状态资产会过期。

js文件大概有50个,编译的时候大概300kb左右。

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

【问题讨论】:

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


    【解决方案1】:

    我的第一直觉告诉我,你有一个只有一个测功机的免费层 heroku 应用程序。闲置一小时后,您的测功机将进入睡眠状态。为了再次唤醒它,您的路由器发送的第一个请求会有一些延迟。

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

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

    【讨论】:

    • 它到底在缓存什么?在我的本地机器上,请求在大约 1.5 秒内加载(不编译文件)。我原以为一旦为 Heroku 编译了资产,即使在停机期间它们也会保持编译状态。对于生产案例,我想确保应用重启、新部署等不会让网站停机几分钟......
    【解决方案2】:

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

    如果你愿意,我可以详细说明如何做到这一点


    其次,正如@Rails4Guides.com 所提到的,您应该知道 Heroku 免费套餐的限制是让您的测功机在一个小时不活动后进入睡眠状态。这是为了保持在 750 hour free limit for AWS instances (Heroku 的基础上)

    要解决这个问题,您需要 invest in another Dyno ($35/mo),或者如前所述,运行一个小任务,以保持每小时 ping 您的应用程序(保持您的测功机运行)

    【讨论】:

    • 谢谢,我在生产中有一个付费的测功机,但我更担心生产中的任何停机或错误导致此缓存被清除,然后应用程序将再次为用户超时。对他们来说不是一次很棒的经历。有没有办法自动编译/推送资产管道(或只是 js)文件到 Cloudfront?
    • asset_sync gem 与 S3 同步 - 我相信您可以让它与 CloudFront 一起使用
    猜你喜欢
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 2015-12-19
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多