Clojure приложение не запускается на Heroku; Алеф + RedisToGo тайм-аут - PullRequest
4 голосов
/ 16 февраля 2012

Мое приложение clojure noir локально работает на 100% и без проблем подключается к RedisToGo.

Проблема в том, что при развертывании в Heroku (мастер git push 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 run lein run repl" и вставляю приведенный выше код aleph, он подключается к redis нормально и я могу читать / записывать данные.

Так что это что-то о том, как heroku загружает приложение, разрывая соединение с RedisToGo и отключая его.

1 Ответ

5 голосов
/ 16 февраля 2012

Выполнение чего-либо побочного эффекта на верхнем уровне очень подозрительно - этот код выполняется как при компиляции, так и при выполнении, поэтому, вероятно, автоматический uberjar, который Heroku делает, не работает, потому что redis недоступен во время компиляции, или что-то вроде тот.

Вместо этого инициализируйте ваш клиент Redis после вызова -main, что обеспечит вам работу в производственной среде. Это можно сделать несколькими способами, например, сначала определив его как nil, а затем выполнив alter-var-root в -main. Мое предпочтительное решение, вероятно, будет что-то вроде:

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

Теперь код для подключения не выполняется до тех пор, пока кто-то не разыграет клиент, что им никогда не следует делать до тех пор, пока приложение не будет запущено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...