SSE(EventSource)在1小时22分钟后超时。有什么方法可以保持持久性吗?

时间:2013-11-04 22:11:22

标签: javascript firebug server-sent-events

我的页面中有一个区域,当数据库发生变化时,消息就会消失。现在,有些日子数据库会发生很大变化,每10分钟就会显示一条新消息。其他日子它只会改变几次。我遇到的问题是,EventSource似乎在1小时22分钟后超时,浏览器不再接收通知。

我想知道是否有办法使EventSources保持持久性(即,只要浏览器显示页面,EventSource仍然存在)。根据我在Google搜索中找到的内容,EventSources应保持活动状态,直到选项卡/窗口关闭。不幸的是,我在Google搜索中找到的内容似乎很少,对我而言似乎并非如此。

2 个答案:

答案 0 :(得分:3)

您没有说套接字关闭发生在哪里(在浏览器上,客户端计算机上的套接字,服务器端的套接字等),但这并不重要,因为所有这些修复都是相同的:发送保持活跃的消息。

服务器应发送保持活动消息。每个,比方说,15秒;或仅在15秒不活动后。 (无论哪种更容易编码,服务器端,为您。)它可以像SSE注释一样简单:“:\ n \ n”(以冒号开头的行被忽略)。我更喜欢发送实际数据,因为:

  • 您可以看到一条消息,允许客户端保持活动检查(见下文)
  • 您希望发送一些有用的内容,例如时间戳(用于检查客户端/服务器时钟是否同步)或指标等。

在客户端,运行一个setTimeout()设置为20秒的计时器。每次从服务器接收任何数据(无论是真实数据还是保持活动状态)时,请终止计时器,然后重新启动计时器。因此,只有当您的服务器超过20秒而没有向您发送任何内容时,才会调用超时功能。发生这种情况时,请终止连接并重新连接。

以上假设问题出在套接字级别。问题可能是浏览器崩溃:可能是内存不足。在这种情况下,我要做的修复是一次/小时计时器(JavaScript中为setTimeout()),以手动关闭并重新打开EventSource连接。或者清除一些可能正在使用的内存缓冲区。使用FireBug或Chrome工具进行一些分析会告诉您是否存在内存问题。

插件:我即将推出的SSE书中“使我们的应用程序生产质量”章节的一半以上是关于保持活力并在重新连接时使用LastId。请在购买时购买: - )

答案 1 :(得分:1)

Chrome浏览器每两分钟报告一次“ net :: ERR_SPDY_PROTOCOL_ERROR 200”,我遇到了同样的问题。

每分钟发送一次SSE评论为我解决了问题。请参见下面的示例Nodejs / Express代码。

exports.addWebServices = function(app) {
  app.get('/ws/clientEvent', function(req, res) {
    res.writeHead(200, {
      'Content-Type': 'text/event-stream',
      'Cache-Control': 'no-cache',
      'Connection': 'keep-alive'
    })

    /* Event handlers for SSE here */

    let keepAliveMS = 60 * 1000;

    function keepAlive() {
      // SSE comment for keep alive. Chrome times out after two minutes.
      res.write(':\n\n');
      setTimeout(keepAlive, keepAliveMS);
    } 

    setTimeout(keepAlive, keepAliveMS);
  }

}