我想使用gRPC公开一个接口,用于在两个服务之间双向传输大型数据集(〜100 MB)。由于默认情况下gRPC施加4 MB的消息大小限制,因此看来,执行此操作的首选方法是手动对块的流进行编码,然后在接收端[1] [2]上重新组合它们。
但是,gRPC还允许通过grpc.max_receive_message_length
和grpc.max_send_message_length
增加消息大小限制,从而可以直接传输最大〜2 GB的消息,而无需任何手动分块或流式传输。快速测试表明,这种更简单的方法在性能和吞吐量方面同样有效,因此对于此用例而言似乎更为理想。假定内存中需要整个数据集。
这些方法中的一种在本质上比另一种更好吗?更简单的非分块方法有潜在的副作用吗?我可以依靠较低层上依赖于MTU的分段来充分避免网络延迟和其他障碍吗?
参考:
4 MB的限制是保护那些尚未考虑邮件大小限制的客户端/服务器。 gRPC本身可以做得更好,可以更高(100 MB),但是大多数应用程序可能受到微不足道的攻击,或者意外退出内存,从而允许该大小的消息。