【问题标题】:Why does gRPC uses Length Prefixed Messages?为什么 gRPC 使用长度前缀消息?
【发布时间】:2019-11-04 18:58:24
【问题描述】:

我想了解 gRPC 如何使用 HTTP2 发送流消息?链接https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md 说,

“Length-Prefixed-Message 项的重复序列在 DATA 帧中传递”

读完这句话我的理解是,每个(protobuf)消息都被gRPC封装在一个HTTP2 Data Frame中并发送过来。如果是这样,那么gRPC为什么需要在消息中附加长度前缀,它不能简单地读取完整的Data Frame Body并假设它是一个完整的消息吗?

我在这里错过了什么?

【问题讨论】:

  • 在这里完全猜测,我会假设这是在流模式(不是一元模式,即 protobuf DSL 中的stream)和缓冲时启用(写入选项),可以在单个 HTTP/2 数据帧中传递多个数据元素。
  • 此外,您链接的文档指出“数据帧边界与长度前缀消息边界无关,实现不应对其对齐做出假设。” - 这表明即使是单个数据消息也可以最终拆分为多个 HTTP/2 数据帧,它决定如此。
  • 谢谢你的解释。

标签: protocol-buffers grpc http2 grpc-java


【解决方案1】:

缺少的部分是不能保证一个 DATA 帧只包含一个 gRPC 消息。 gRPC 消息是一个更高层的流,用作 HTTP/2 的有效负载。它可以按照您在官方 gRPC 库中描述的方式实现,但就协议而言,接收具有多个 gRPC PDU 的某些 DATA 帧是完全有效的。

【讨论】:

    猜你喜欢
    • 2021-07-12
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多