grpc服务器端推送的机制是怎样的?

Shi*_*iyu 5 server-push http2 grpc

当我使用 grpc 编写服务时,我尝试通过服务器端推送机制将 http/2 与 websocket 进行比较。

我知道对于 websocket,客户端将向服务器发送带有 Upgrade: WebSocket 和 Connection: Upgrade 标头的请求并建立长期连接。连接建立后,服务器将自由发送数据。

但对于 grpc,由于它是在 http/2 上路由的,来自 wiki 页面https://en.wikipedia.org/wiki/HTTP/2_Server_Push,它表示服务器需要预测客户端将发送的潜在请求,并尽早发送 PUSH_PROMISE 帧。

这是我的两个问题:

  1. 这是否意味着服务器还需要从客户端接收相应的响应(请求)来响应此 PUSH_PROMISE 标头,以决定客户端是否想要接收或拒绝特定推送?

  2. 在 Grpc 中,如果我有服务器端流,请说每 1 秒从服务器发送一条消息。这是否意味着服务器需要每 1 秒或至少在服务器推送到客户端的每个数据帧之前向客户端发送 PUSH_PROMISE?

Eri*_*son 8

gRPC 目前不支持/使用 PUSH_PROMISE。

gRPC 中的流式 RPC 使用 HTTP/2 流;整个 RPC 包含在 HTTP 的请求/响应中。主要区别在于,HTTP/2 实现通常允许此类流是流式传输和双向的(客户端可以在读取部分响应后在请求中发送更多内容),而在 HTTP/1 中则是随机的。

在 gRPC 中,客户端始终会发起 RPC。但对于服务器流式传输,服务器可以随着时间的推移通过流回复多条消息。这与您使用 websocket 描述的场景类似。