grpc服务端推送的机制是什么?

What is the mechanism of grpc server side pushing?

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

我知道对于 websocket,客户端将发送带有升级请求:WebSocket 和连接:将 headers 升级到服务器并建立 long-lived 连接。然后服务器会在建立连接后自由发送数据。

但是对于 grpc,因为它是在 http/2 上从 wiki 页面 https://en.wikipedia.org/wiki/HTTP/2_Server_Push 路由的,它表示服务器需要预测客户端可能发送的请求,并发送一个PUSH_PROMISE帧越早越好。

这是我的两个问题:

  1. 是否意味着服务器也需要从客户端接收相应的响应(请求)以响应此PUSH_PROMISE header来决定客户端是否要接收或者拒绝某个推送?

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

gRPC 当前 support/use PUSH_PROMISE.

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

在 gRPC 中,客户端将始终发起 RPC。但是对于 server-streaming ,服务器可以随时间通过流回复多条消息。这类似于您使用 websockets 描述的场景。