减少Heroku上的Clojure启动时间(错误R10)

时间:2014-11-25 09:26:46

标签: heroku clojure timeout boot

我的Clojure Compojure应用程序超过了绑定到Heroku端口50%的启动时间限制。然后,它需要一次或两次调用heroku restart来实现它。我可能需要太多依赖项,但我不知道我是否可以动态执行此操作。

有没有办法通过以后加载依赖关系在Clojure中更快地绑定? Ruby领域普遍接受的解决方案是heroku-forward,但这对Clojure不起作用。

此问题与Heroku Boot Timeout (Error R10)

有关

CircleCI处理我的部署,而uberjar是预先构建的。

2 个答案:

答案 0 :(得分:3)

TL; DR:没有简单的方法可以减少Heroku上的Clojure启动时间。改为部署uberjar。

我和Clojure + Heroku有同样的问题。我认为关于下载依赖项的时间问题 ,因为Heroku已将其缓存,因此heroku-forward之类的解决方案无法正常工作。 Clojure应用程序需要首先加载完整的Clojure运行时,然后运行时将编译应用程序的代码。该引导和编译时间导致超时错误。 有两种方法可以解决此问题:

  1. 使用lein uberjar在另一台计算机上编译,然后部署jar。
  2. 不要使用Leiningen。编写一个小Java只是为了首先声明端口(一种鬼),然后从Java手动引导Clojure,关闭端口,同时启动应用程序的主要功能以重新占用端口。然而,这种方式有点奇怪,因为你如此早地声称这个端口,Heroku会把你的(幽灵)应用程序带到世界,因此停机时间非常长。

答案 1 :(得分:1)

我也生成ubjerjar,由于启动时间而在升级期间停机对我来说是一个问题(即使我不在Heroku上)。

我注意到如果我事先aot我的代码,生成uberjar需要更长的时间,但之后它会更快启动。在我的情况下这就足够了。 使用lein,添加:aot :allboot中有一个内置的(aot)任务。

您也可以尝试控制JVM选项(heroku似乎根据this link支持它们)。一些尝试的选择是:

-client -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -Xverify:none