Web 套接字关闭时的 Heroku H15 错误

Rya*_*Her 2 heroku go websocket

我有一个 Go 服务作为 Heroku 上的网络套接字服务器。客户端每 20 秒 ping 服务器一次,它似乎保持连接打开。问题在于,当套接字连接关闭时,Heroku 路由器会抛出 H15 错误,认为请求花费了太多时间。例如,如果 Web 套接字连接已打开 300 秒,Heroku 日志将显示:

……H15…… dyno=web.1 connect=1ms service=300000ms status=503 bytes=147....

任何人都经历过这种情况?

Dav*_*avo 6

是的!我经历过这种情况,经过一些深度调试后,我得出结论,这只是 Heroku 路由器引擎中的“误报”。我的调试是这样的:

  1. 在客户端和 Heroku 上运行的 WebSocket 服务器之间创建一个 WebSocket 连接。
  2. 如果您使用 socket.io 或类似的库,它很可能会在将协议切换到 WebSocket 之前建立 HTTP 轮询连接。(您可以在 Heroku 路由器日志中看到这些 GET/POST 请求)。
  3. 一旦使用 WebSocket 协议建立连接,客户端将通过发送心跳保持连接(实际上服务器也可以这样做)。最初,您不会在 Heroku 路由器日志中看到此请求,因为它仍处于挂起状态(它处于打开状态并每隔几秒发送一次数据包,即心跳)。您可以使用 Chrome DevTools Network 选项卡来监控这一点。
  4. 心跳会阻止 Heroku 路由器终止请求,因为每次在客户端和服务器之间传输几个字节时,Heroku 路由器超时计时器(55 秒)都会重置
  5. 但是,每当您的客户端关闭连接时(即:关闭浏览器选项卡、刷新页面、断开互联网连接等);Heroku 路由器检测到请求被终止(这是我基于调试的猜测)因为请求是“待处理”,它的反应好像它空闲了 X 毫秒,其中 X 是从收到请求开始的时间直到它关闭,你才会看到这样的日志:service=79859ms status=101

结论:每当您的客户端应用程序终止 WebSocket 连接时Heroku 路由器都会记录错误 15 行,该连接在 X 毫秒内运行良好。因此,在许多情况下,可能只是用户离开了您的应用。

我希望这对人们有所帮助,并且你们可以少担心一件事情去睡觉:)