Ошибки Heroku H15 с каналами Эликсир / Феникс

Как только я начал использовать Каналы с 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. Подождите минуту или около того (WiFi отключается / ОС переходит в спящий режим)
  4. Произойдет ошибка H15.

Я уже установил тайм-аут на 45 секунд в своем UserChannel; Я бегу эликсир 1.4.2, Феникс 1.2.1 и мой phoenix.js был только что обновлен до того, что использовался в Фениксе 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)

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

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

1 ответ

Решение

Документы Phoenix рекомендуют установить время ожидания для передачи через веб-сокет < 55 секунд:

defmodule HelloWeb.UserSocket do
  use Phoenix.Socket

  ...

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

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

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

Другие вопросы по тегам