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

标签 javascript firebug server-sent-events

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

我想知道是否有办法保持 EventSources 持久化(即,只要浏览器显示页面,EventSources 就一直存在)。根据我在 Google 搜索中发现的内容,EventSources 应该保持事件状态,直到选项卡/窗口关闭。不幸的是,我在 Google 搜索中找到的东西似乎很少,而对我来说似乎并非如此。

最佳答案

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

服务器应该发送一条保持事件消息。或者每隔 15 秒;或者仅在 15 秒不活动后。 (无论哪个更容易编码,服务器端,对你来说。)它可以像 SSE 评论一样简单:“:\n\n”(忽略以冒号开头的行)。我更喜欢发送实际数据,因为:

  • 您会看到一条消息,允许客户端保持事件检查(见下文)
  • 您肯定会发送一些有用的东西,例如时间戳(用于检查客户端/服务器时钟是否同步)或指标等。

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

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

Plug:在我即将出版的 SSE 书中,超过一半的“提高我们的应用程序生产质量”一章是关于保持事件状态和在重新连接时使用 LastId。发售时请购买:-)

关于javascript - SSE (EventSource) 在 1 小时 22 分钟后超时。有什么方法可以保持它的持久性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19778231/

相关文章:

javascript - 如何关闭 Server-Sent Events 事件

javascript - 服务器发送的事件不是(刷新?)正确地与 Flask 和 Redis 与 nginx 前端

javascript - 一次只允许运行一个间隔

与包含相反的 Javascript 数组

html - 用于 outlook 的 HTML 代码分析器,如 firebug

css - 未应用样式

css - 调试打印样式表的建议?

android - 服务器在 Android 中发送事件

javascript - ExtJS/Javascript : How the function for clicking event actually works?

javascript - 相对定位元素在为其父元素设置动画时消失