gRPC - Firestore如何实现服务器->客户端实时流式传输

el_*_*gro 5 websocket http2 grpc firebase-realtime-database google-cloud-firestore

一些StackOverflow 帖子和这篇内容丰富的博客文章(但可能已经过时)表明,当前在浏览器中实现的 HTTP/2 尚不支持推送流,并且在需要此功能时仍应使用 WebSockets 或 SSE。

我很好奇 Google Firestore(它通过 HTTP 实现 gRPC)是如何实现这一目标的。据我所知,在打开使用 Firestore 的网站后,没有使用以下内容:

问题

  1. FireStore 是否只是简单地使用类似于长轮询的方式,其中客户端与服务器打开 HTTP/2 流(或使用 Chrome 时的 HTTP/3),并且该服务器只是保持该流打开以在需要时推送消息。
  2. 这是由于 HTTP/2 浏览器实现的一些最新进展而成为可能,还是服务器/客户端软件库开发人员只是想出了一种使用这种长轮询方法来模拟服务器->客户端推送流的方法。
  3. 如果上述情况属实,那么我们现在(2021 年)是否可以说 HTTP/2 可以自行实现 WebSocket 和/或 SSE 提供的相同功能,并且 WebSocket 即将被淘汰。

Ric*_*lle 4

Firestore 似乎根本没有在浏览器中使用 gRPC。相反,当在浏览器中运行时,它们使用 WebChannel。这是一个支持传统 HTTP 请求和流的抽象。当浏览器本身不支持流传输时,WebChannel似乎会使用轮询。

我不知道为什么 Firestore 朝这个方向发展,但这并不是浏览器中 gRPC 或浏览器中 HTTP/2 的根本限制。(大多数)浏览器实现者遗漏的 HTTP/2 主要功能是预告片。grpc -web 项目是 gRPC 协议子集的实现,旨在在浏览器中运行并解决缺乏预告片支持的问题。该子集包括服务器端流式传输,并且应该非常适合 Firestore 用例。