EventSource 可能存在竞争条件?
Possible race condition with EventSource?
我正在使用服务器发送事件 (SSE),我连接到 SSE 后端的代码如下所示:
function sseSubscribe() {
events = new EventSource("/v1/sse/" + sseID + "/" + lastEventId);
events.addEventListener("message", sseHeartbeat);
events.addEventListener("error", sseError);
events.addEventListener("reply", sseReply);
events.addEventListener("refresh", sseRefresh);
}
此函数被调用以设置初始 SSE 连接,但 也会在需要重新连接时(因为连接因任何原因中断)。
在服务器上,如果 lastEventId
大于 0,它会将任何丢失的消息流式传输到客户端。
所以,假设,如果 new EventSource()
被阻止,这将不起作用,因为事件会在相应的事件处理程序(回复、刷新等)注册之前流回浏览器。
然而,据我所知,情况并非如此(我相信调用 new EventSource
是一个非阻塞操作?虽然不确定)。但是,我想 可能 如果用户的计算机足够慢,并且他们的连接足够快,那么 可能 丢失的消息可以在之前流式传输回来听众已注册。
这是一种合理的恐惧,还是我应该对上面的代码感到相对安全?
重申一下,此代码似乎有效,但我担心在添加相应的处理程序之前,消息可能会从新的 EventSource 连接流回。这是否合理,或者它发生的可能性为 0%?
连接在当前 Javascript 执行完成后发生。我相信这对所有浏览器来说都是安全的,尽管我没有明确的参考。
例如,Chrome 从计时器启动连接,该计时器可能绑定到与例如 setTimeout
相同的事件循环:https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/modules/eventsource/event_source.cc;l=99?q=EventSource&ss=chromium
我正在使用服务器发送事件 (SSE),我连接到 SSE 后端的代码如下所示:
function sseSubscribe() {
events = new EventSource("/v1/sse/" + sseID + "/" + lastEventId);
events.addEventListener("message", sseHeartbeat);
events.addEventListener("error", sseError);
events.addEventListener("reply", sseReply);
events.addEventListener("refresh", sseRefresh);
}
此函数被调用以设置初始 SSE 连接,但 也会在需要重新连接时(因为连接因任何原因中断)。
在服务器上,如果 lastEventId
大于 0,它会将任何丢失的消息流式传输到客户端。
所以,假设,如果 new EventSource()
被阻止,这将不起作用,因为事件会在相应的事件处理程序(回复、刷新等)注册之前流回浏览器。
然而,据我所知,情况并非如此(我相信调用 new EventSource
是一个非阻塞操作?虽然不确定)。但是,我想 可能 如果用户的计算机足够慢,并且他们的连接足够快,那么 可能 丢失的消息可以在之前流式传输回来听众已注册。
这是一种合理的恐惧,还是我应该对上面的代码感到相对安全?
重申一下,此代码似乎有效,但我担心在添加相应的处理程序之前,消息可能会从新的 EventSource 连接流回。这是否合理,或者它发生的可能性为 0%?
连接在当前 Javascript 执行完成后发生。我相信这对所有浏览器来说都是安全的,尽管我没有明确的参考。
例如,Chrome 从计时器启动连接,该计时器可能绑定到与例如 setTimeout
相同的事件循环:https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/modules/eventsource/event_source.cc;l=99?q=EventSource&ss=chromium