【问题标题】:Heroku H15 errors with Elixir/Phoenix ChannelsElixir/Phoenix 频道的 Heroku H15 错误
【发布时间】:2017-07-24 23:14:26
【问题描述】:

一旦我开始在 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=

在笔记本电脑上重现此问题的可靠方法:

  1. 打开连接到 WebSockets 的 Phoenix 页面
  2. 合上笔记本电脑的盖子
  3. 等一下(WiFi 断开/操作系统进入睡眠状态)
  4. 会出现 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 迁移之外)。

【问题讨论】:

标签: heroku elixir phoenix-framework phoenix-channels


【解决方案1】:

Phoenix docs 建议将 websocket 传输的超时时间设置为

defmodule HelloWeb.UserSocket do
  use Phoenix.Socket

  ...

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

他们的解释是:

这可确保所有空闲连接在到达 Heroku 的 55 秒超时窗口之前被 Phoenix 关闭。

【讨论】:

  • 感谢您的回答彼得;不幸的是,我已经设置了超时,但这并不能阻止错误的发生。
  • 啊,我的错 — timeout 参数设置在 channel 上,而不是 transport。将它放在应该在的transport 上,确实可以解决问题!
猜你喜欢
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 2017-08-18
  • 2012-10-15
相关资源
最近更新 更多