От новичка до гуру: Курсы программирования на CyberDuff

Приложение Clojure не запускается на Heroku; Тайм-аут Aleph + RedisToGo

Мое приложение 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» и вставляю приведенный выше код алефа, он отлично подключается к redis, и я могу читать/записывать данные.

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

16.02.2012

Ответы:


1

Выполнение чего-то побочного эффекта на верхнем уровне очень подозрительно - этот код выполняется как при компиляции, так и при выполнении, поэтому, вероятно, автоматический 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)
  ...)

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

16.02.2012
  • Да, я только что попытался добавить задержку в соединение Redis и протестировал развертывание, у меня была такая же проблема с тайм-аутом. Коммит: github.com/dmix/documeds/commit/ 16.02.2012
  • Не то чтобы это имело значение, но почему вы определяете r дважды? Ваша программа может быть исключением, но, похоже, большую часть времени вам нужен общий клиент для вашего приложения (хотя вам, вероятно, следует убедиться, что он не используется в потоках). 16.02.2012
  • Дальнейшие попытки развертывания исправления для задержки процесса, похоже, решили проблему. Я определяю клиент Redis отдельно для парсера, так как в будущем он будет выполняться изолированно. 17.02.2012
  • Новые материалы

    Представляем Narwhal Technologies (Nrwl)
    6 декабря 2016 г. Маунтин-Вью, Калифорния С тех пор, как Виктор Савкин и я (Джефф Кросс) присоединились к команде Angular в Google на заре Angular 1, Angular продемонстрировал феноменальный..

    Путь AWS  — «Изучение машинного обучения — 10 начинающих ИИ и машинного обучения на AWS».
    Универсальный ресурсный центр для изучения искусственного интеллекта и машинного обучения. НОЛЬ или ГЕРОЙ, начните свое путешествие здесь. Получите решения и пройдите обучение у экспертов AWS...

    5 простых концепций Python, ставших сложными
    #заранее извините 1) Переменные x = 4 y = 5 Переменная в Python — это символическое представление объекта. После присвоения некоторого объекта переменной Python мы приобретаем..

    «Освоение вероятности: изучение совместной, предельной, условной вероятности и теоремы Байеса —…
    Виды вероятности: Совместная вероятность Предельная вероятность Условная вероятность Диаграмма Венна в вероятностях: В “Set Theory” мы создаем диаграмму Венна...

    Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
    Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

    Отслеживание состояния с течением времени с дифференцированием снимков
    Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

    Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
    Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..