EventSource 重新连接时某些服务器发送的事件丢失

Vov*_*van 5 javascript server-sent-events eventsource

在我们的应用程序中,我们有 SSE 连接,生存时间为 5 分钟,5 分钟后服务器关闭连接,客户端自动重新连接。

\n\n

但这里的问题是:当客户端重新连接时,后端可能发生了一些事件,并且它不会传递到SSE连接,因为它\xe2\x80\x99s尚未建立。

\n\n

所以有一些 1-2 秒的时间段我们可能会丢失事件。

\n\n

我们该如何处理这个案子?你有什么意见 ?

\n\n

在我看来,我们只有一个选择:每次 SSE 重新连接后,在服务器上执行额外的 GET 请求来刷新数据。

\n

Dar*_*ook 7

这正是SSE 协议Last-Event-ID中 HTTP 标头的设计目的。

在服务器端,当您获得新连接时,您应该查找该标头。如果已设置,请立即将丢失的数据间隙传输给他们。您应该id将推送的每条消息的标头设置为某个唯一标识符。

在客户端,对于您的特定用例,您不需要执行任何操作:当 SSE 重新连接运行时,它会使用它收到的最后一个数据的 id 自动发送该标头。

在我的书《Data Push Apps with HTML5 SSE》的第 5 章中,我认为您还应该在您推出的 JSON 数据包中明确包含相同的唯一 id,并且您也应该支持将其作为Last-Event-IDPOST/GET 参数给出。这使您可以灵活地使用 SSE 的长轮询替代方法,并且还意味着如果重新连接来自客户端而不是服务器端,它就可以工作。(前者将用于支持较旧的浏览器,尽管随着 IE 的消亡,这一点越来越不重要;如果您实现自己的保持活动机制,则需要后者。)