我的clojure noir应用程序在本地工作100%,连接到RedisToGo没问题。
问题是当我部署到Heroku(git push heroku master)时,我收到超时错误:
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 run lein run repl”并粘贴上面的aleph代码时,它连接到redis并且我可以读/写数据。
所以它是关于heroku如何启动应用程序的东西,它打破了与RedisToGo的连接并将其计时。
答案 0 :(得分:5)
在顶级做一些有效的事情是非常可疑的 - 代码在编译时和执行时都会被执行,所以自动的uberjar Heroku可能会失败因为redis在编译时不可用,或类似的东西那。
相反,在调用-main
后初始化redis客户端,这将确保您处于生产环境中。您可以通过多种方式完成此操作,例如,最初将其定义为nil,然后在alter-var-root
中执行-main
。我的首选解决方案可能是:
(def r (delay (redis-client ...)))
(defn get-stuff []
(let [client @r] ...))
(defn -main [& args]
(get-stuff)
...)
现在连接的代码直到有人解析客户端才会执行,在应用程序启动并运行之前,他们不应该这样做。