Elixir/Phoenix 个频道的 Heroku H15 错误
Heroku H15 errors with Elixir/Phoenix Channels
一旦我开始使用 Phoenix 的 Channels,我就开始在 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=
在笔记本电脑上重现这一点的可靠方法:
- 打开一个连接到 WebSockets 的 Phoenix 页面
- 合上笔记本电脑的盖子
- 等一下(WiFi 到 disconnect/OS 进入休眠状态)
- 会出现H15错误
我已经在我的 UserChannel 上设置了 45 秒的超时;我是 运行 Elixir 1.4.2
,Phoenix 1.2.1
,我的 phoenix.js
刚刚升级到 Phoenix 1.3.0-rc0
(link to rev)
我可以看到前端记录的错误,但之后它愉快地重新连接到后端:
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 error code definition 所以我正在寻找一个修复或解决方法来消除错误(除了迁移当然是来自 Heroku。
Phoenix docs 建议将 websocket 传输的超时设置为 < 55 秒:
defmodule HelloWeb.UserSocket do
use Phoenix.Socket
...
## Transports
transport :websocket, Phoenix.Transports.WebSocket,
timeout: 45_000
...
end
他们的解释是:
这确保任何空闲连接在达到 Heroku 的 55 秒超时之前被 Phoenix 关闭 window。
一旦我开始使用 Phoenix 的 Channels,我就开始在 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=
在笔记本电脑上重现这一点的可靠方法:
- 打开一个连接到 WebSockets 的 Phoenix 页面
- 合上笔记本电脑的盖子
- 等一下(WiFi 到 disconnect/OS 进入休眠状态)
- 会出现H15错误
我已经在我的 UserChannel 上设置了 45 秒的超时;我是 运行 Elixir 1.4.2
,Phoenix 1.2.1
,我的 phoenix.js
刚刚升级到 Phoenix 1.3.0-rc0
(link to rev)
我可以看到前端记录的错误,但之后它愉快地重新连接到后端:
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 error code definition 所以我正在寻找一个修复或解决方法来消除错误(除了迁移当然是来自 Heroku。
Phoenix docs 建议将 websocket 传输的超时设置为 < 55 秒:
defmodule HelloWeb.UserSocket do
use Phoenix.Socket
...
## Transports
transport :websocket, Phoenix.Transports.WebSocket,
timeout: 45_000
...
end
他们的解释是:
这确保任何空闲连接在达到 Heroku 的 55 秒超时之前被 Phoenix 关闭 window。