Clojure应用程序未在Heroku上启动;Aleph+;重新多哥超时

Clojure应用程序未在Heroku上启动;Aleph+;重新多哥超时,clojure,heroku,Clojure,Heroku,我的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 完整日志如下: 当我删除此redis连接代码时,它可以很好地部署: (:use [aleph.redis :onl

我的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
完整日志如下:

当我删除此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 fine,我可以读/写数据


因此,heroku如何启动应用程序,断开与RedisToGo的连接并计时。在顶层做一些副作用是非常可疑的-代码在编译和执行时都会执行,因此,uberjar Heroku的自动操作可能失败了,因为redis在编译时不可用,或者类似的东西

相反,在调用
-main
后初始化redis客户端,这将确保您处于生产环境中。您可以通过多种方式实现这一点,例如,首先将其定义为nil,然后在
-main
中执行
alter var root
。我首选的解决方案可能是:

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

现在,只有在有人解除客户端的权限后,才能执行连接代码,在应用程序启动并运行之前,他们不应该这样做。

是的,我刚刚尝试为redis连接和测试部署添加延迟,遇到了相同的超时问题。提交:这并不重要,但为什么要定义两次
r
?您的程序可能是一个例外,但似乎大多数时候您都希望在应用程序中共享一个客户端(尽管您可能应该确保它不会在线程之间共享),进一步尝试部署固定到延迟进程似乎可以解决问题。我将为scraper单独定义redis客户机,因为它将在将来单独执行。