我们在 heroku cedar 中部署了一个 grails 应用程序,我们的应用程序需要 60 多秒才能启动,根据heroku的说法:
一个 Web 进程需要超过 60 秒才能绑定到其分配的 $PORT。发生这种情况时,测功机的进程被杀死,测功机被认为是崩溃的
我们尽可能减少了依赖,但在某些情况下启动需要超过 60 秒,所以我们的应用程序被 heroku 停止。
你知道一些避免这种情况的方法吗?
对于这个问题,我有一个很好的解决方案:我分叉了 Grails buildpack 并添加了一些代码,强制 Jetty 绑定到$PORT
早期,这样 Grails 就可以一直占用它想要启动的时间;在 Grails 启动期间,请求会因为 404 错误而失败,但至少应用程序可以可靠地启动。
https://github.com/funfork/heroku-buildpack-grails-earlybind
要使用它:
heroku config:set BUILDPACK_URL=https://github.com/funfork/heroku-buildpack-grails-earlybind
如果您需要强制重新编译(确保您没有提交待处理):
git commit --allow-empty -m "empty commit"
git push heroku master
给你!
你可以做两件事。第一个是尝试显式设置您的依赖项,以便依赖项解析不会花费那么长时间。请参阅Pete 关于慢速 Grails 启动的回答。
您可以尝试的特定于 Heroku 的方法是使用新的2X Dyno Size,它为您提供 1024MB 的 RAM 而不是 512MB(但请注意,它们是每小时 0.10 美元而不是 0.05 美元,并且不再属于免费套餐)。
最后,由于 Heroku 正在寻找与 的绑定$PORT
,因此您可以监听$PORT
任何请求并将其排队,直到应用程序完全启动。
我对 Grail 的应用程序也有同样的体验。我的一个应用程序正确启动,但随后我部署了另一个应用程序并遇到了这个问题,尽管它们的依赖项配置非常相似。
我通过删除 BuildConfig.groovy(jquery、jquery-ui、twitter-bootstrap 和 lesscss-resources)中的一些 js 插件并手动添加这些资源来解决它。
在本地,这或多或少地将启动时间从 20 秒减少到 13 秒(总是在谈论第一次启动,在交互模式下连续启动非常快)。考虑到我还创建了删除表并引导了一些数据,尽管在删除提到的插件之前避免这样做并不能解决我的问题。
有趣的是,我的其他应用程序如何在 heroku 中及时启动,拥有所有插件。