HTTP / 2与Web套接字进行双向消息流传输

时间:2020-01-22 20:05:40

标签: websocket grpc http2 server-sent-events

除了不将HTTP / 2框架公开给Javascript的浏览器之外,在哪种情况下,Websockets会比双向流gRPC(基于HTTP / 2构建)实现实时双向消息流更好的选择?此外,HTTP 2.0是否为全双工(双向)是否意味着实际上支持服务器推送?那么,对SSE之类的东西有什么需求?这已经过时了吧?

1 个答案:

答案 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 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

gRPC是使用HTTP / 2流的协议,但未在JavaScript Streams API上实现,因此对于浏览器通信,它需要一些中间件,例如grpc-web

WebSockets

WebSockets是较低级别的抽象,它具有更广泛的浏览器支持,并且支持全双工通信。但是,由于它是较低级别的抽象,因此通常需要库来处理通信。