除了不将HTTP / 2框架公开给Javascript的浏览器之外,在哪种情况下,Websockets会比双向流gRPC(基于HTTP / 2构建)实现实时双向消息流更好的选择?此外,HTTP 2.0是否为全双工(双向)是否意味着实际上支持服务器推送?那么,对SSE之类的东西有什么需求?这已经过时了吧?
答案 0 :(得分:6)
这里有很多方面。服务器发送事件,JavaScript Streams API主要是用于较低级别协议的浏览器API。
使用Websockets和HTTP / 2的服务器到服务器通信具有相似的属性。两者都是二进制和高效协议。 HTTP / 2提供了每个流背压,这对于从多个源接收推送消息或有时很忙的客户端可能很重要。 gRPC是HTTP / 2之上的框架,为开发人员提供了更高的抽象。
Server Sent Events是客户端订阅事件流并不断从服务器接收事件的一种方式。该API比其他方法具有更高的抽象性,并且更易于使用。但是,格式是指定的邮件格式,格式为文本。
开发使用服务器发送的事件的Web应用程序比使用websockets更容易。您需要在服务器上放置一些代码才能将事件流式传输到前端,但是客户端代码的工作原理几乎与处理任何其他事件相同。
示例代码
const evtSource = new EventSource("/v1/stream/topic");
evtSource.onmessage = function(event) {
// handle event
}
JavaScript Streams API是更新的JavaScript API,用于支持浏览器和服务器之间的二进制流。可以与ReadableStream中较新的Fetch API使用。由于这是二进制流,因此它可以具有更广泛的用例,并且对于使用例如未来几年的网络组装。
API有点复杂。示例代码:
fetch("https://www.example.org/").then((response) => {
const reader = response.body.getReader();
const stream = new ReadableStream({
start(controller) {
// implementation
}
})
二进制流的优点是它可以用于自然二进制数据,例如自定义格式的音频或二进制表示形式。
在HTTP / 2或HTTP / 3 Streams上使用JavaScript Streams API优于其他选择,因为它支持每个流(不仅是每个TCP连接) backpressure 。
gRPC是使用HTTP / 2流的协议,但未在JavaScript Streams API上实现,因此对于浏览器通信,它需要一些中间件,例如grpc-web。
WebSockets是较低级别的抽象,它具有更广泛的浏览器支持,并且支持全双工通信。但是,由于它是较低级别的抽象,因此通常需要库来处理通信。