Ошибки 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=
Надежный способ воспроизвести это на ноутбуке:
- Откройте страницу Phoenix, которая подключается к WebSockets
- Закройте крышку вашего ноутбука
- Подождите минуту или около того (WiFi отключается / ОС переходит в спящий режим)
- Произойдет ошибка 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.