EventSource 重新连接时丢失了一些 Server Sent 事件

Some of Server Sent events lost while EventSource reconnecting

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

但这里的问题是:当客户端重新连接时,后端可能发生了一些事件,并且它不会传递给 SSE 连接,因为它还没有建立。

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

我们如何处理这种情况?你怎么看?

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

您可以在服务器中对事件进行排队,并在客户端处于活动状态时对事件进行出队。

无论客户端的连接状态如何,只需将所有事件添加到队列中即可。

客户端连接后,从队列中取出所有事件。

Instead of sending the message directly to clients the application sends it to the broker. Then the broker sends the message to all subscribers (which may include the original sender) and they send it to the clients.

参考https://www.tpeczek.com/2017/09/server-sent-events-or-websockets.html

这正是 the SSE protocol 中的 Last-Event-ID HTTP header 的设计目的。

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

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

在我使用 HTML5 SSE 的数据推送应用一书的第 5 章中,我认为您还应该明确地在您推送的 JSON 数据包中包含相同的唯一 ID,并且您也应该支持 Last-Event-ID 作为 POST/GET 参数给出。这使您可以灵活地使用 SSE 的 long-polling 替代方法,并且还意味着如果重新连接来自 client-side 而不是 server-side,它也可以工作。 (前者用于支持较旧的浏览器,尽管随着 IE 的消亡,这变得越来越不重要;如果您实现自己的 keep-alive 机制,则需要后者。)