当前位置: 首页 > 知识库问答 >
问题:

为什么在GRPC/protobuf文件传输中使用“stream”?

濮阳征
2023-03-14

我见过几个这样的例子:

service Service{
  rpc updload(stream Data) returns (google.protobuf.Empty) {};
  rpc download(google.protobuf.Empty) returns (stream Data) {};
}

message Data { bytes bytes = 1; }

使用流的目的是什么,它是否能提高传输效率?

理论上-是的-我显然不想流式传输我的文件传输,但这就是在连接上发生的。。。那么,这个关键字的实际好处是什么呢?它是否强制执行某种形式的特殊缓冲以减少一些开销?无论哪种方式,数据都在完整传输!

共有2个答案

蒯翰墨
2023-03-14

它更有效,因为在一次调用中,可能会发送多条消息。

这不仅避免了与服务器重新建立另一个(希望是TLS,即更多工作)连接,而且避免了客户端和服务器“存根”的旋转;客户端和服务器都准备好接收更多消息

这有点类似于和你的朋友打电话,他在挂断电话前说“哦,另一件事......”。而不是挂断电话,然后,5分钟后,给你回电话,打断晚餐,让你暂停电影。

柳晔
2023-03-14

答案与gRPC图像上传问题非常相似,尽管从不同的角度来看。

将大下载(10 MB)作为单个响应消息对下载的大小有很大限制,因为整个响应消息是一次发送和处理的。对于大多数用例,将100 MB的文件分块成1-10 MB的块比要求所有100 MB一次都在内存中要好得多。这也允许下载器在获取整个文件之前开始处理文件,从而减少处理延迟。

如果没有流,分块将需要多个RPC,这很烦人,协调起来很麻烦,而且性能复杂。因为完成RPC有延迟,为了获得合理的性能,您要么必须并行执行许多RPC(但是有多少?)或者有很大的批量大小(但是有多大?)。多个RPC也可以访问更冷的应用程序缓存,因为每个RPC都去到不同的后端。

使用流式传输提供了与非分块方法相同的吞吐量,而没有普通分块方法的许多麻烦。由于流式传输是流水线式的(服务器可以在发送前一个块后立即开始发送下一个块),因此客户端和服务器之间不会增加每个块的延迟。这使得选择块大小变得更加容易,因为有各种各样的“合理”大小会表现相似,系统会随着网络性能的变化而自然做出反应。

虽然在现有流上发送消息比创建新的RPC开销更小,但对于许多用户来说,这种差异可以忽略不计,通常最好以对应用程序有利的架构方式构建RPC,而不仅仅是在gRPC中进行小的优化。在这种情况下使用流的原因是为了使您的应用程序在较低的复杂性下性能更好。

 类似资料:
  • 我试图在工作中建立一个利用gRPC的PoC。这里的谷歌文档将带我们浏览一个示例应用程序。我想知道protobuf net,尤其是protogen,是否有能力理解执行gRPC调用所需的服务定义和类?还是这件事正在进行中?如果我使用谷歌的protoc生成客户机和服务器代码(包括服务定义和RPC调用),使用protobuf net生成我的业务对象,这会有效吗。

  • 我正在尝试实施gRPC,现在我遇到了各种各样的问题,但我就是不明白我做错了什么。我遵循这个文档:https://github.com/grpc/grpc-java/blob/master/README.md 现在,当我试图构建我的项目时,我总是会遇到这样的错误 在我的Android Studio外部库中,我有Pro buf-java-3.12.1 jar。 在我的project gradle文件中

  • 我目前有一个依赖于通过安全套接字传输的JSON的原始RPC设置,但我想切换到gRPC。不幸的是,我还需要访问windows上的AF\U UNIX(Microsoft最近开始支持,但gRPC尚未实现)。 由于我有一个现有的工作连接(使用另一个库进行管理),我的首选方法是将其与GRPC结合使用来发送/接收命令,而不是JSON解析,但我正在努力确定实现这一点的最佳方法。 我已经看到将自定义传输插入gRP

  • 我试图理解protobuf和gRPC,以及如何使用这两种方法。你能帮我理解以下几点吗: 考虑到OSI模型,在哪里,例如Protobuf在第4层? 通过消息传输来思考“流”是怎样的,gRPC在做什么而protobuf错过了什么? 如果发送方使用protobuf,服务器是否可以使用gRPC,或者gRPC是否添加了只有gRPC客户端才能提供的内容? 如果gRPC可以使同步和异步通信成为可能,那么Prot

  • ProtoBuf 与 gRPC ProtoBuf 是一套接口描述语言(IDL)和相关工具集(主要是 protoc,基于 C++ 实现),类似 Apache 的 Thrift)。用户写好 .proto 描述文件,之后使用 protoc 可以很容易编译成众多计算机语言(C++、Java、Python、C#、Golang 等)的接口代码。这些代码可以支持 gRPC,也可以不支持。 gRPC 是 Goog

  • 问题内容: 客户端向从服务器发送文件的大小可能大于5G,而不是从服务器发送到主服务器的大小。 从站将临时文件保存到自己吗?我不希望发生这种情况,因为这会降低上载速度并浪费从站的内存。 有什么办法可以避免这种情况?在golang中传输大文件的最佳方法是什么? 问题答案: 是的,有以避免存储-转发方式的标准方式:只要客户端连接从服务器后应该打开到主服务器的连接,然后就 流 从客户那里的数据。通常,这是