我应该通过 gRPC 传输大数据集而不需要手动分块吗?
Should I transmit large data sets via gRPC without manual chunking?
我想使用 gRPC 公开一个接口,用于在两个服务之间双向传输大型数据集 (~100 MB)。因为 gRPC 默认强加了 4 MB 的消息大小限制,看来执行此操作的首选方法是手动编码块流,并在接收端重新 assemble 它们 [1][2]。
但是,gRPC 还允许通过 grpc.max_receive_message_length
和 grpc.max_send_message_length
增加消息大小限制,从而可以直接传输大小高达 ~2 GB 的消息,而无需任何手动分块或流媒体。快速测试表明,这种更简单的方法在性能和吞吐量方面同样有效,因此它似乎更适合此用例。假设内存中需要整个数据集。
这些方法中的一种是否天生就优于另一种?更简单的非分块方法是否有任何潜在的副作用?我能否依靠较低层的依赖于 MTU 的分段来避免网络延迟和其他障碍?
参考文献:
4 MB 的限制是保护 clients/servers 没有考虑邮件大小限制的人。 gRPC 本身可以更高(100 MB),但大多数应用程序可能会受到轻微攻击或意外内存不足,从而允许该大小的消息。
如果您愿意一次接收 100 MB 的邮件,则可以增加限制。
我想使用 gRPC 公开一个接口,用于在两个服务之间双向传输大型数据集 (~100 MB)。因为 gRPC 默认强加了 4 MB 的消息大小限制,看来执行此操作的首选方法是手动编码块流,并在接收端重新 assemble 它们 [1][2]。
但是,gRPC 还允许通过 grpc.max_receive_message_length
和 grpc.max_send_message_length
增加消息大小限制,从而可以直接传输大小高达 ~2 GB 的消息,而无需任何手动分块或流媒体。快速测试表明,这种更简单的方法在性能和吞吐量方面同样有效,因此它似乎更适合此用例。假设内存中需要整个数据集。
这些方法中的一种是否天生就优于另一种?更简单的非分块方法是否有任何潜在的副作用?我能否依靠较低层的依赖于 MTU 的分段来避免网络延迟和其他障碍?
参考文献:
4 MB 的限制是保护 clients/servers 没有考虑邮件大小限制的人。 gRPC 本身可以更高(100 MB),但大多数应用程序可能会受到轻微攻击或意外内存不足,从而允许该大小的消息。
如果您愿意一次接收 100 MB 的邮件,则可以增加限制。