Heroku上的Node.js Web Socket H15空闲连接超时
Posted
技术标签:
【中文标题】Heroku上的Node.js Web Socket H15空闲连接超时【英文标题】:Node.js Web Socket H15 Idle Connection timeout on Heroku 【发布时间】:2014-11-02 07:39:24 【问题描述】:我们在 Heroku 上运行一个 Node.js 和 Express 应用程序,该应用程序使用 ws 库来实现实时 Web 套接字。下面是我们看到的众多 H15 超时的屏幕截图。
我读过Heroku terminates any idle connection after 55 seconds,但是当连接打开时,我们的套接字每 5 秒来回发送一次乒乓球。一段服务器代码如下:
var _this = this;
this.server.on('connection', function(ws)
// check for a ping, respond with pong
ws.on('message', function(data)
data = data.toString('utf8');
if (data === PING)
ws.send(PONG);
);
ws.on('close', function(err)
TL.logger.info('Socket closed: '+path);
_this.sockets = _.filter(_this.sockets, function(_ws)
return ws != _ws;
);
);
ws.on('error', function(err)
TL.logger.info('Socket error: '+path);
_this.sockets = _.filter(_this.sockets, function(_ws)
return ws != _ws;
);
);
_this.sockets.push(ws);
);
这是 chrome 中客户端套接字的图片:
知道如何防止空闲连接吗?
【问题讨论】:
你有办法解决这个问题吗? 遗憾的是,我们仍然有一堆看似随机的空闲连接。 @Andrew 我们在两年后遇到了同样的错误。你找到原因了吗? 虽然我还没有完全摆脱它们,但通过从节点服务器而不是客户端发起 ping,我看到它们的频率要低得多。同样在上面的代码中(很旧,抱歉!),我发送字符串“ping”和“pong”,但 websocket 规范支持真正的 ping 和 pong 帧,你应该发送它。例如,如果您使用的是ws
,则它只是ws.ping()
(并将其包装在try catch 中)
嗨@Andrew,我知道这个问题很老,但我遇到了同样的问题,这是我的详细答案,如果对其他人有用***.com/questions/32728030/…。祝你好运,希望你不再遇到这些错误。
【参考方案1】:
披露:我是 Heroku 的 Node.js 平台所有者。
您是否在客户端看到了这一点?还是只是错误报告仪表板?
我建议专注于在至少一个客户端上重现错误,看看是否真的有任何影响。否则,您可能会浪费时间调试误报。
如果您决定继续调试,您可能需要安装免费的 papertrail / nodetime / new relic / strongloop 插件来准确确定哪些请求正在触发 H15。
【讨论】:
感谢您的评论!我们不使用 socket.io,只使用 ws 模块,而且我还没有在客户端上看到任何问题,我只是在仪表板中看到了错误。 对不起,大多数与 websocket 相关的问题都是基于 socket.io 的。我已经更新了我的答案以反映 ws 库。 我在 Meteor 应用程序中遇到了同样的错误(Meteor 基于 Node),这篇文章表明它与 Heroku 和 root/apex/naked 域(ALIAS/ANAME 等)有关,我们也可以使用:***.com/questions/13063683/h15-on-heroku-sse-request 您好,我知道这是一个老问题,但在 2020 年我仍然遇到这些错误,经过调试和测试后,我意识到这不是我的应用程序中的错误,而是 Heroku 路由器的工作方式(也许5 年前,这些错误在测功机监视器中显示为严重错误)。无论如何,如果这对任何人都有帮助,这是我的答案***.com/questions/32728030/…以上是关于Heroku上的Node.js Web Socket H15空闲连接超时的主要内容,如果未能解决你的问题,请参考以下文章
Heroku cedar 堆栈上的 Node.js 端口问题