2012-02-16 118 views
4

我的clojure noir應用程序在本地100%正常工作,並連接到RedisToGo沒有問題。Clojure應用程序無法在Heroku上啓動; Aleph + RedisToGo超時

問題是,當我部署到Heroku的(混帳推Heroku的高手),我得到一個超時錯誤:

Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch 

完整的日誌是在這裏:https://gist.github.com/1842439

當我刪除此Redis的連接代碼,它部署罰款:

(:use [aleph.redis :only (redis-client)])  
(def r (redis-client {:host redis-url :password redis-pass :port redis-port})) 

奇怪的是,當我跑「的Heroku運行雷音運行REPL」,並在上面的ALEPH代碼粘貼,它連接到Redis的很好,我可以讀/寫數據。

因此,關於如何啓動與RedisToGo的連接並對其進行計時的應用程序啓動。

回答

5

在頂層做一些副作用是非常可疑的 - 代碼在編譯時以及執行時執行,所以uberjar Heroku自動執行的代碼可能會失敗,因爲redis在編譯時不可用,或者某些東西像那樣。

而是在-main被調用後初始化您的redis客戶端,這將確保您處於生產環境中。您可以通過多種方式完成此操作,例如,最初將其定義爲零,然後在-main中執行alter-var-root。我首選的方案很可能是這樣的:

(def r (delay (redis-client ...))) 
(defn get-stuff [] 
    (let [client @r] ...)) 
(defn -main [& args] 
    (get-stuff) 
    ...) 

現在的代碼不執行,直到有人derefs客戶端,這是他們應該永遠不會做,直到應用程序啓動和運行進行連接。

+0

是的,我剛剛嘗試添加延遲到redis連接和測試部署,有相同的超時問題。提交:https://github.com/dmix/documeds/commit/2aca28bb228c36374e5a21bccbb774438bc1c223 – dMix 2012-02-16 19:07:25

+0

不是重要的,但爲什麼你定義'r'兩次?你的程序可能是一個例外,但似乎大多數情況下你希望跨應用程序使用共享客戶端(儘管您應該確保它不跨線程共享) – amalloy 2012-02-16 19:35:59

+0

進一步嘗試部署固定程序來延遲進程似乎可以修復問題。我爲scraper分別定義了redis客戶端,因爲它將在未來單獨執行。 – dMix 2012-02-16 20:19:15