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

问题描述 投票:1回答:2

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

但是这里的问题是:客户端重新连接时,后端可能会发生一些事件,由于尚未建立,因此该事件不会传递给SSE连接。

因此,当我们松开事件时,会有一些1-2秒的时隙。

我们如何处理此案?您的意见是什么?

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

javascript server-sent-events eventsource
2个回答
1
投票

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

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

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

而不是直接将消息发送给客户端应用程序发送给经纪人。然后经纪人将消息发送给所有人订户(可能包括原始发件人)并将其发送给客户。

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


0
投票

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

在服务器端,当您获得新的连接时,应查找该标头。如果已设置,则立即将丢失的数据间隙流式传输到它们。并且您应该为每条推送的消息设置id标头,使其具有一些唯一的标识符。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.