Ошибки Heroku H15 с каналами Elixir / Phoenix

Как только я начал использовать каналы с Phoenix, я начал получать много следующих ошибок на Heroku:

heroku[router]: at=error code=H15 desc="Idle connection" method=GET
path="/socket/websocket?guardian_token=eyJhbGciOiJIUz[...]&vsn=1.0.0" host=[...]
dyno=web.1 connect=0ms service=87803ms status=503 bytes=

Надежный способ воспроизвести это на ноутбуке:

  1. Откройте страницу Phoenix, которая подключается к WebSockets.
  2. Закройте крышку ноутбука
  3. Подождите минуту или около того (Wi-Fi отключается / ОС переходит в спящий режим)
  4. Произойдет ошибка H15.

Я уже установил тайм-аут в 45 секунд для своего UserChannel; Я использую Elixir 1.4.2, Phoenix 1.2.1, и мой phoenix.js был только что обновлен до того, который использовался в Phoenix 1.3.0-rc0 (ссылка на версию)

Я вижу ошибку, зарегистрированную в интерфейсе пользователя, но после этого он успешно подключается к серверу:

2017-03-04 23:28:55.351 receive: ok user:2 phx_reply (3)
2017-03-04 23:29:24.269 channel: error user:2
2017-03-04 23:29:28.713 push: user:2 phx_join (4)
2017-03-04 23:29:28.745 receive: ok user:2 phx_reply (4)

Любая помощь или идеи, как решить эту проблему, приветствуются.

Изменить: я знаком с H15 от Heroku определение кода ошибки, поэтому я ищу исправление или обходной путь для избавления от ошибок (кроме перехода с Heroku, конечно).


person Svilen    schedule 04.03.2017    source источник
comment
devcenter.heroku.com/articles/error-codes#h15-idle- соединение - это, вероятно, ответит на ваш вопрос.   -  person Justin Wood    schedule 05.03.2017
comment
@JustinWood Спасибо за ссылку, но я ищу исправление или обходной путь для этой проблемы для моего приложения Phoenix, а не объяснение, что означает код ошибки H15.   -  person Svilen    schedule 05.03.2017


Ответы (1)


Документы Phoenix рекомендуют установить тайм-аут для веб-сокета. транспорт до ‹55 секунд:

defmodule HelloWeb.UserSocket do
  use Phoenix.Socket

  ...

  ## Transports
  transport :websocket, Phoenix.Transports.WebSocket,
    timeout: 45_000
    ...
end

Их объяснение таково:

Это гарантирует, что любые незанятые соединения будут закрыты Phoenix до того, как они достигнут 55-секундного тайм-аута Heroku.

person Peter Brown    schedule 09.02.2018
comment
Спасибо за ответ Питер; к сожалению, у меня уже установлен тайм-аут, и это не предотвращает ошибок. - person Svilen; 10.02.2018
comment
Ах, моя беда - параметр timeout был установлен на channel вместо transport. Поместите его на transport, где он должен быть, действительно решает проблему! - person Svilen; 13.02.2018