HTTP流和服务器发送事件有什么区别?

Bre*_*ren 7 http node.js http-streaming server-sent-events

我的理解是HTTP流式传输涉及客户端发送HTTP请求,然后响应随时间发送的请求,允许服务器基本上推送到客户端.在我所看到的情况下,SSE似乎按照相同的原则运作,但更为正式化.这接近正确的理解吗?

我看到了这些问题,但他们并没有直接回答我的问题.

HTTP:流水线,保持活动和服务器发送事件之间的关系是什么? 什么是长轮询,Websockets,服务器发送事件(SSE)和Comet?

我还查看了这个https://www.html5rocks.com/en/tutorials/eventsource/basics/#disqus_thread 教程来设置SSE,看起来我想象的是如何设置HTTP流.

Sai*_*ish 8

恕我直言,HTTP2 服务器发送的事件比 HTTP 流具有丰富的功能。

在单向数据流(服务器 -> 客户端)中,客户端可以根据后端事件进行编排,服务器发送的事件可能是一个不错的选择。

例如:

# ---------- client side -----------

const eventSource = new EventSource("//your-api/workflow/state");

eventSource.addEventListener("queued", function(event) {
    ...
}
eventSource.addEventListener("started", function(event) {
    ...
}
eventSource.addEventListener("failed", function(event) {
    ...
}
eventSource.addEventListener("success", function(event) {
    ...
}

Run Code Online (Sandbox Code Playgroud)

服务器发送事件的限制:

  • SSE 事件消耗浏览器打开的连接。
  • 最大打开连接数有限制,不是在浏览器选项卡级别,而是在整个浏览器级别
  • 在我写这篇文章的时候,Chrome 和 Firefox 的分数是 6(太低了)。此限制针对每个浏览器 + 域,因此这意味着您可以跨所有选项卡打开 6 个到www.example1.com 的SSE 连接,以及另外 6 个到www.example2.com的 SSE 连接。

HTTP 流式传输

HTTP 流在许多用例中都非常有用。如果我们只对来自服务器的消息流感兴趣,这可能会很方便。

示例场景:

假设我们想将日志文件内容流式传输到客户端。它可能是一个巨大的文件,或者文件内容不断更新,我们喜欢将其发送给客户端(如日志尾部)。在这种情况下,HTTP Stream( Transfer-Encoding: chunked)就可以满足我们的需求。

# ---------- client side -----------
const streamRequest = (url) => {
    fetch(url).then(function (response) {
        let reader = response.body.getReader();
        let decoder = new TextDecoder();
        return readData();
        function readData() {
            return reader.read().then(function ({value, done}) {
                console.log(value)
                if (value) {
                    let newData = decoder.decode(value, {stream: !done});
                    console.log(newData);    
                }
                if (done) {
                    console.log('end of stream');
                    return;
                }
                return readData();
            });
        }
    });
}

Run Code Online (Sandbox Code Playgroud)

流响应的局限性:

  • 在流响应(分块)的情况下 - HTTP/2 不支持 HTTP 1.1 的分块传输编码机制,因为它提供了自己的、更高效的数据流机制。


rsp*_*rsp 7

SSE实际上是HTTP流式传输的一种形式.它只是一个MIME类型为"text/event-stream"的HTTP响应,它发送以双换行符结尾的纯文本消息.

SSE不是以前不可能做到的事情,但网站必须使用WebSocket连接,AJAX长轮询,彗星,定期轮询等,现在SSE API已经标准化,实现非常简单.看到:

https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events

要记住的一件事是IE不支持SSE,包括Edge和IE Mobile:

因此,除非您知道他们使用的浏览器,否则您无法真正将它用于更广泛的受众.

  • 那么最后,实际上有什么区别呢?这个问题不回答那个。如果两者都相同(除了你说的 mime 类型标头),那么在我们已经有了 http 流的情况下,甚至引入 SSE 有什么意义?我觉得这个问题还有更多。 (2认同)
  • MDN 表示:“当不通过 HTTP/2 使用时,SSE 会受到最大打开连接数的限制,这在打开多个选项卡时尤其痛苦,因为该限制是针对每个浏览器的,并且设置为非常低的数字( 6)`截至 2020 年,您对此有何评论?这个限制还存在吗?如果是,那么我们不应该首先使用这项技术,而应该选择 WebSocket 连接之类的技术?你怎么认为?谢谢你! (2认同)