Node.js HTTP流和服务器发送事件之间有什么区别?
我的理解是,HTTP流包括客户端发送HTTP请求,然后响应随时间发送的请求,从而允许服务器实质上推送到客户端。在我所读到的内容中,SSE似乎遵循同样的原则,但更正式。这接近于正确的理解吗 我看到了这些问题,但它们并没有直接回答我的问题 我也看了这个Node.js HTTP流和服务器发送事件之间有什么区别?,node.js,http,server-sent-events,http-streaming,Node.js,Http,Server Sent Events,Http Streaming,我的理解是,HTTP流包括客户端发送HTTP请求,然后响应随时间发送的请求,从而允许服务器实质上推送到客户端。在我所读到的内容中,SSE似乎遵循同样的原则,但更正式。这接近于正确的理解吗 我看到了这些问题,但它们并没有直接回答我的问题 我也看了这个 关于设置SSE的教程,看起来就像我想象的HTTP流是如何设置的 SSE实际上是HTTP流的一种形式。它只是一个HTTP响应,MIME类型为“文本/事件流”,它发送以双换行符结尾的纯文本消息 SSE并不是以前不可能做到的事情,但该网站必须使用Web
关于设置SSE的教程,看起来就像我想象的HTTP流是如何设置的 SSE实际上是HTTP流的一种形式。它只是一个HTTP响应,MIME类型为“文本/事件流”,它发送以双换行符结尾的纯文本消息 SSE并不是以前不可能做到的事情,但该网站必须使用WebSocket连接、AJAX长轮询、comet、定期轮询等。现在使用SSE,API已经标准化,实现非常简单。见: 需要记住的一点是,IE(包括Edge和IE Mobile)不支持SSE:
因此,除非您知道他们使用什么浏览器,否则您还无法真正将其用于更广泛的受众。IMHO,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) {
...
}
服务器发送事件的限制:
- SSE事件使用浏览器打开的连接
- 对最大打开连接数的限制不是在浏览器选项卡级别,而是整个浏览器级别
- 我写这篇文章的时候,Chrome&Firefox把它设为6(太低了)。此限制是针对每个浏览器+域的,因此这意味着您可以在所有选项卡上打开6个SSE连接,然后再打开6个SSE连接
传输编码: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();
});
}
});
}
流响应的限制:
- 对于流响应(分块)-HTTP/2不支持HTTP 1.1的分块传输编码机制,因为它为数据流提供了自己的、更高效的机制
当不通过HTTP/2使用时,SSE受到最大打开连接数的限制,这在打开多个选项卡时可能会特别痛苦,因为限制是每个浏览器的,并且设置为非常低的数字(6)
到2020年,您对此有何看法?这个限额还存在吗?如果是的话,那么我们一开始就不应该使用这种技术,而是更喜欢WebSocket连接之类的东西?你怎么认为?非常感谢。