【问题标题】:Node.js Web Socket H15 Idle Connection timeout on HerokuHeroku上的Node.js Web Socket H15空闲连接超时
【发布时间】: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


【解决方案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 等)有关,我们也可以使用:stackoverflow.com/questions/13063683/h15-on-heroku-sse-request
  • 您好,我知道这是一个老问题,但在 2020 年我仍然遇到这些错误,经过调试和测试后,我意识到这不是我的应用程序中的错误,而是 Heroku 路由器的工作方式(也许5 年前,这些错误在测功机监视器中显示为严重错误)。无论如何,如果这对任何人都有帮助,这是我的答案stackoverflow.com/questions/32728030/…
猜你喜欢
  • 2015-01-06
  • 2017-04-19
  • 2015-12-25
  • 2014-07-06
  • 2020-04-29
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
相关资源
最近更新 更多