在我们的应用程序中,我们具有SSE连接,其生存时间为5分钟,在5分钟后,服务器关闭了连接,客户端自动重新连接。
但是这里的问题是:客户端重新连接时,后端可能会发生一些事件,由于尚未建立,因此该事件不会传递给SSE连接。
因此,当我们松开事件时,会有一些1-2秒的时隙。
我们如何处理此案?您的意见是什么?
从我的角度来看,我们只有一个选择:每次重新连接SSE后,都要在服务器上执行其他GET请求以刷新数据。
您可以在服务器中将事件排队,并在客户端处于活动状态时使事件出队。
不管客户端的连接状态如何,只需将所有事件添加到队列中。
当客户端连接时,从队列中取出所有事件。
而不是直接将消息发送给客户端应用程序发送给经纪人。然后经纪人将消息发送给所有人订户(可能包括原始发件人)并将其发送给客户。
参考https://www.tpeczek.com/2017/09/server-sent-events-or-websockets.html
这正是Last-Event-ID
中的the SSE protocol HTTP标头设计的目的。
在服务器端,当您获得新的连接时,应查找该标头。如果已设置,则立即将丢失的数据间隙流式传输到它们。并且您应该为每条推送的消息设置id
标头,使其具有一些唯一的标识符。
在客户端,对于您的特定用例,您无需执行任何操作:当SSE重新连接运行时,它将使用接收到的最后一个数据的ID自动发送该标头。
[在我的书《带有HTML5 SSE的数据推送应用程序》的第5章中,我认为您还应该明确地将相同的唯一ID包含在您推出的JSON数据包中,并且应该支持将Last-Event-ID
作为POST给出/ GET参数也是如此。这使您可以灵活地使用SSE的长轮询替代方法,也意味着如果重新连接来自客户端而不是服务器端,则它可以工作。 (前者将用于支持较旧的浏览器,尽管随着IE的消失,这一问题越来越少;如果实现自己的保持活动机制,则后者将是必需的。)