【问题标题】:How to do payload compression in grpc?如何在 grpc 中进行有效载荷压缩?
【发布时间】:2016-08-19 14:13:59
【问题描述】:

我正在开发一个基于 grpc 的应用程序,其中请求数据可能高达 500KB,响应可能更大,因此我想压缩数据。我很难在 grpc 中找到有关如何操作的文档/示例。 clientContext 中的 set_compression_algorithm 有什么作用?我必须在服务器端设置一些东西吗?

或者我应该忘记 grpc 上的压缩,并自己对 protobuf 消息进行压缩/解压缩?

【问题讨论】:

  • 哪种语言?你在用 C++ 吗?

标签: c++ grpc


【解决方案1】:

grpc::ClientContext::set_compression_algorithm 方法选择用于客户端调用的算法,即从客户端发送到服务器的数据。

在服务器端,您可以通过grpc::ServerBuilder::SetCompressionOptions(参见https://github.com/grpc/grpc/blob/master/include/grpc++/server_builder.h)控制压缩选项在频道创建时(即用于所有服务器调用),这允许你要:

  1. 选择服务器假定的压缩算法。默认情况下,所有算法均已启用。
  2. 选择默认情况下对所有服务器响应使用哪种压缩算法(前提是对等客户端支持。如果不支持,则响应将不压缩发送)。

对于服务器上的一次性呼叫响应,您可以使用grpc::ServerContext::set_compression_algorithmgrpc::ServerContext::set_compression_level。推荐使用后者,因为它会根据客户端保证支持的请求压缩级别选择最佳算法。

我将在接下来的几天里整理出 hello-world 风格的示例。我创建了一个问题来跟踪此问题:https://github.com/grpc/grpc/issues/6297 随意 ping 那里。我还实现了一些低级日志记录以显示一些压缩统计信息,以便你们能够断言压缩确实有效(否则一切都是完全透明的)。

【讨论】:

  • 添加一些关于压缩统计的日志会很棒。期待这个。谢谢!
  • 只是想确认一下:使用ClientContext::set_compression_algorithm,是否意味着请求数据将被给定的算法压缩?而在服务器端,如果我将 default_compression_algorithm 设置为 GRPC_COMPRESS_GZIP,那么对客户端的所有响应都会被 gzip 压缩?
  • 添加额外压缩日志信息的 PR 是 github.com/grpc/grpc/pull/6305(它是一个跟踪器,这意味着您必须使用包含“压缩”的环境变量 GRPC_TRACE 启动二进制文件。例如;$ GRPC_TRACE=compression,channel ./your/binary将在启用 compressionchannel 跟踪器的情况下运行 /your/binary。现在,使用 grep 查找 grpc_register_tracer 以查看其他可用的跟踪器。
  • 关于您的第二条评论:是的。您可以在频道创建时设置默认算法/级别(最好是级别,如所述),也可以通过ServerContext 在每次呼叫的基础上启用它。唯一的区别是通道默认适用于所有传出服务器调用,而不必每次都通过ServerContext启用它。
  • 如果你觉得有用,记得采纳答案:)
猜你喜欢
  • 2017-02-07
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
相关资源
最近更新 更多