【发布时间】: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,我知道这个问题很老,但我遇到了同样的问题,这是我的详细答案,如果对其他人有用stackoverflow.com/questions/32728030/…。祝你好运,希望你不再遇到这些错误。
标签: node.js heroku express websocket timeout