【问题标题】:socket.io on node.js and heroku, idle timeout errornode.js 和 heroku 上的 socket.io,空闲超时错误
【发布时间】:2015-12-25 21:13:27
【问题描述】:

我正在使用 socket.io,它在本地运行良好,但是一旦使用 heroku 进行生产,它就会超时。我知道这是因为如果在 55 秒滚动窗口内没有听到任何声音,heroku 将终止/超时 Web 套接字连接。

我遇到的问题是我将 socket.io 的心跳间隔设置为 60000,所以在 60 秒内没有听到任何声音,即在 55 秒窗口之外:

io.set('heartbeat interval', 60000); //heroku timeout with Idle connection error. 

我需要某种方式在 55 秒的窗口内轮询服务器,以保持连接处于活动状态。改变心跳间隔并不是一个真正的选择,所以我不知道该怎么做。

【问题讨论】:

  • 那可能不行。我正在优雅地处理连接/断开连接事件,但使用用户通知等。它不会像那样工作,因为将有一个断开连接和连接事件的整个过程每 60 秒触发一次。
  • 为什么不能设置为小于heroku timeout?
  • 我的应用程序对客户端连接采用“按分钟计费”逻辑,因此通过心跳测量连接时间。我可以有效地完成“54 秒前的账单”,但这并不理想。
  • 可能在客户端排队客户端请求然后检查套接字状态,如果需要重新打开它,然后发送?

标签: javascript node.js sockets heroku websocket


【解决方案1】:

一般来说,您希望路由器断开空闲连接,这样它们就不会消耗后端的系统资源。挑战在于将实际空闲/丢失的连接和有一段时间没有说话的实时连接的客户端分开。

一种解决方案是让客户端在 55 秒的窗口内 ping 服务器。一个例子在这里:

https://github.com/hunterloftis/websocket-ping/blob/2dd45b100a754ee8b151ab3d16d2ee3787d2dc8e/index.html#L65

https://github.com/hunterloftis/websocket-ping/blob/2dd45b100a754ee8b151ab3d16d2ee3787d2dc8e/index.html#L80-L83

基本上只是io.emit('ping') 上的setInterval。这样,只要客户端还活着,它就会继续保持与服务器的连接。

【讨论】:

    猜你喜欢
    • 2014-11-02
    • 2014-07-06
    • 1970-01-01
    • 2017-04-19
    • 2017-01-18
    • 1970-01-01
    • 2012-07-25
    • 2017-06-10
    • 2013-06-09
    相关资源
    最近更新 更多