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

Posted

技术标签:

【中文标题】gRPC - Firestore 如何实现服务器-> 客户端实时流式传输【英文标题】:gRPC - How does Firestore implement server-> client real-time streaming 【发布时间】:2021-05-14 11:29:09 【问题描述】:

Some *** 帖子和 this 信息丰富的博客帖子(但可能已过时)表明当前在浏览器中实现的 HTTP/2 尚不支持推送流,并且在此功能时仍应使用 WebSockets 或 SSE需要。

我很好奇通过 HTTP 实现 gRPC 的 Google Firestore 是如何实现这一点的。据我在打开一个使用 Firestore 的网站后所知道的,以下内容均未使用:

WebSockets - DevTools 不显示任何打开的 Websockets。还有this。 SSE - 我在 DevTools 源或 relevant source code 的任何地方都找不到“事件源” WebRTC - 不适用。我在chrome://webrtc-internals 中也找不到任何东西 HTTP/2Server 推送(又名 Push_Promise)- 无关

问题

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

【问题讨论】:

【参考方案1】:

Firestore 似乎根本没有在浏览器中使用 gRPC。相反,在浏览器中运行时,they use a WebChannel。这是支持传统 HTTP 请求和流式传输的抽象。好像a WebChannel will use polling浏览器原生不支持流式传输的时候。

我不知道 Firestore 为何朝这个方向发展的背景故事,但这并不是浏览器中 gRPC 或浏览器中 HTTP/2 的基本限制。被(大多数)浏览器实现者遗漏的 HTTP/2 的主要特性是trailers。 grpc-web project 是 gRPC 协议子集的实现,旨在在浏览器中运行并解决缺少预告片支持的问题。该子集包括服务器端流式传输,应该非常适合 Firestore 用例。

【讨论】:

以上是关于gRPC - Firestore 如何实现服务器-> 客户端实时流式传输的主要内容,如果未能解决你的问题,请参考以下文章

无法安装 cloud_firestore 所需的 BoringSSL-GRPC (0.0.7)

云原生微服务 gRPC 如何实现负载均衡

gRPC 客户端流是如何实现的

Abp + Grpc 如何实现用户会话状态传递

GRPC: 如何实现分布式日志跟踪?

快速构建一个Golang下通用的GRPC服务,拒绝996