使用Heroku进行套接字轮询时响应时间长

Long response time on socket polling with Heroku

本文关键字:响应时间 套接字 Heroku 使用      更新时间:2023-09-26

我的客户端正在使用socket.io 1.0+lib连接到套接字服务器,如下所示:

$scope.socket = io.connect( "/gateway" );

在服务器端,我启动express服务器和套接字服务器,连接为:

httpServer = http.createServer( app ).listen( process.env.PORT, process.env.IP || "0.0.0.0", function() { 
    io = require( 'socket.io' )( httpServer ).of("/gateway");
    io.on('connection', function( socket ) {
        // socket events here
    }
});

然后在heroku上测试该项目。让我很困扰的是这个来自chrome dev工具的屏幕

您可以看到,不断有2个轮询请求被执行。一个在秒内得到响应,另一个大约需要26秒。如果我点击其中一个,我可以看到它们之间的真正区别是请求方法:使用POST的方法得到快速响应,使用GET的方法保持挂起状态,直到大约26秒后得到响应(或超时)。

在我的开发环境(c9.io)中,我看不到这种行为,但在测试(heroku自由节点)中我看到了这种行为。

可能正因为如此,我只在heroku上得到了一些其他奇怪的行为,例如在tab close上我没有收到disconnect事件,而在c9上我收到了。

有人面临同样的问题吗?有解决办法吗?

事实证明,当使用polling传输时,对可见的打开连接的长响应被滥用。在这种情况下,一个25秒的连接被保持打开,用于客户端-服务器通信。这是正常的,尽管你必须了解它——一些日志模块/解决方案可能会将其视为长响应,并不断警告你。

简而言之,

  • 如果使用sebsocket传输,则会始终打开一个websocket连接
  • 如果使用polling传输,则每25-26秒将(重新)建立一个新的GET连接