我应该通过 gRPC 传输大型数据集而无需手动分块吗?

Posted

技术标签:

【中文标题】我应该通过 gRPC 传输大型数据集而无需手动分块吗?【英文标题】:Should I transmit large data sets via gRPC without manual chunking? 【发布时间】:2020-02-14 04:22:09 【问题描述】:

我想使用 gRPC 公开一个接口,用于在两个服务之间双向传输大型数据集(~100 MB)。由于 gRPC 在默认情况下施加了 4 MB 的消息大小限制,因此执行此操作的首选方法似乎是手动编码块流,并在接收端重新组装它们 [1][2]。

但是,gRPC 还允许通过 grpc.max_receive_message_lengthgrpc.max_send_message_length 增加消息大小限制,从而可以直接传输最大约 2 GB 的消息,而无需任何手动分块或流式传输。快速测试表明,这种更简单的方法在性能和吞吐量方面同样有效,这使得它看起来更适合这个用例。假设内存中需要整个数据集。

其中一种方法天生就比另一种更好吗?更简单的非分块方法是否有任何潜在的副作用?我能否依靠较低层的 MTU 相关分片来避免网络延迟和其他障碍?


参考资料:

    Chunking large messages with gRPC Sending files via gRPC

【问题讨论】:

【参考方案1】:

4 MB 的限制是为了保护没有考虑过消息大小限制的客户端/服务器。 gRPC 本身可以提高很多(100 MB),但大多数应用程序可能会受到轻微攻击或意外内存不足,从而允许该大小的消息。

如果您愿意一次性接收 100 MB 的消息,那么增加限制即可。

【讨论】:

另外,应该考虑客户端和服务器的内存使用情况。在内存有限的设备上,大消息将不适合内存并失败。如果在您的情况下这不是问题,那么增加接收限制(发送限制没有限制)就可以了。消息在线路上逐包传输。

以上是关于我应该通过 gRPC 传输大型数据集而无需手动分块吗?的主要内容,如果未能解决你的问题,请参考以下文章

grpc和protobuf结合的示例

使用分块传输通过 HTTP POST 流式传输麦克风输出

检查 gRPC 流何时为空或不是流式传输数据

gRPC 服务器端流式传输:如何无限期地继续流式传输?

GRPC的理解

分块传输编码 - 浏览器行为