2014-11-25 4 views
3

My Clojure Compojure 응용 프로그램이 Heroku의 포트에 바인딩 할 때의 부팅 시간 제한을 50 % 초과합니다. 그렇다면 heroku restart에 1 ~ 2 번의 전화가 걸립니다. 내가 너무 많은 의존성을 요구할 수도 있지만, 나는 이것을 동적으로 할 수 있을지 모른다.Heroku에서 Clojure 부팅 시간 줄이기 (오류 R10)

나중에 종속성을로드하여 Clojure에서 더 빠르게 바인드 할 수있는 방법이 있습니까? Ruby에서 일반적으로 받아 들여지는 솔루션은 heroku-forward이지만 Clojure에서는 작동하지 않습니다.

이 문제는 Heroku Boot Timeout (Error R10)과 관련됩니다.

CircleCI가 내 배포를 처리하고 uberjar가 빌드됩니다.

+0

배포하기 전에 프로젝트를 컴파일 하시겠습니까? – DanLebrero

+0

@dAni, 내 지식으로, CircleCI는 uberjar를 앞쪽으로 컴파일합니다. –

+1

응용 프로그램을 시작하기 위해 어떤 명령을 사용하고 있습니까 (즉,'Procfile' 파일에 무엇이 있습니까?)? – codefinger

답변

3

TL : DR : Heroku에서 Clojure 부팅 시간을 줄이는 쉬운 방법은 없습니다. 대신 uberjar를 배포하십시오.

나는 Clojure + Heroku와 동일한 문제가있었습니다. 나는 대부분은 종속성을 다운로드 할 시간이 약이라고 생각한다. 왜냐하면 Heroku는 그것들을 캐시하고 있기 때문에 heroku-forward과 같은 해결책은 작동하지 않을 것이기 때문이다. Clojure 앱은 먼저 전체 Clojure 런타임을로드해야하며 런타임은 앱의 코드를 컴파일합니다. 부트 스트래핑 및 컴파일 시간이 길어지면 시간 초과 오류가 발생합니다. 이 문제를 해결하려면 다음 두 가지가 있습니다

  1. 컴파일 다른 컴퓨터에서 lein uberjar를 사용하는 대신 항아리를 배포하여가.
  2. Leiningen을 사용하지 마십시오. 작은 자바를 작성하여 포트를 먼저 요청한 다음 (유령 같은) Java에서 Clojure를 수동으로 부트 스트립하고, 포트를 닫은 후 앱의 메인 기능을 시작하여 포트를 다시 차지하십시오. 그러나,이 방법은 좀 이상하고 항구를 너무 일찍 요청하기 때문에, Heroku는 당신의 (고스트) 앱을 열심히 가지고 오므로 중단 시간이 꽤 길어집니다.
1

나는 또한 ubjerjar을 생성하며, 시작 시간으로 인해 업그레이드하는 동안 중단 시간이 문제가되었습니다 (비록 내가 Heroku가 아니 었더라도).

나는 내 코드가 미리 aot이라면, uberjar를 만드는 데 시간이 오래 걸린다는 것을 알았지 만, 나중에 더 빨리 부팅됩니다. 그것은 내 경우 충분했다. lein 인 경우 :aot :all을 추가하십시오. boot에 기본 제공 (aot) 작업이 있습니다.

또한 JVM 옵션을 제어하려고 할 수 있습니다 (heroku는 this link에 따라 지원하는 것 같습니다). 시도해 볼 수있는 옵션은 다음과 같습니다.

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