gRPC for Python中的压缩支持状态如何?

gRPC for Python中的压缩支持状态如何?,python,compression,grpc,Python,Compression,Grpc,我试图使用Python gRPC实现作为参考来实现gRPC客户机和服务器 根据位于的spec文档,应支持以下几个用例: 客户端应用程序可以通过调用 适当的API方法。有两种情况可能会导致压缩 要配置: 在通道创建时,设置通道默认压缩 因此,应在不存在 每RPC压缩配置 在响应时,通过:对于一元 RPCs,{Client,Server}上下文实例。对于流式RPC {客户端,服务器}编写器实例。在这种情况下,减少了配置 完全禁用压缩 对等点间不对称的压缩方法 gRPC对等方可以选择 使用与请求

我试图使用Python gRPC实现作为参考来实现gRPC客户机和服务器

根据位于的spec文档,应支持以下几个用例:

客户端应用程序可以通过调用 适当的API方法。有两种情况可能会导致压缩 要配置:

  • 在通道创建时,设置通道默认压缩 因此,应在不存在 每RPC压缩配置
  • 在响应时,通过:对于一元 RPCs,{Client,Server}上下文实例。对于流式RPC {客户端,服务器}编写器实例。在这种情况下,减少了配置 完全禁用压缩

对等点间不对称的压缩方法

gRPC对等方可以选择 使用与请求不同的压缩方法进行响应, 包括不执行任何压缩,无论信道和 RPC设置(例如,如果压缩会导致较小或 负收益)

压缩的特定禁用

如果用户(通过先前的 描述的机制)在下一条消息中禁用压缩的请求 必须以未压缩的方式发送。这有助于防止 野兽/犯罪攻击。这适用于一元和流 案例

其中一些似乎是可能的,而另一些则不是。一个接一个地解决这些问题,我认为这是可能的:

  • 在通道创建时,设置通道默认压缩 因此,应在不存在 每RPC压缩配置
这很有效。在服务器上,可以指定:

from grpc._cython.cygrpc import CompressionAlgorithm, CompressionLevel

server_options = [(
     "grpc.default_compression_algorithm", CompressionAlgorithm.gzip
),(
     "grpc.default_compression_level", CompressionLevel.high
)]

server = grpc.server(
    futures.ThreadPoolExecutor(max_workers=10), options=server_options
)
关于客户:

from grpc._cython.cygrpc import CompressionAlgorithm

channel_options = [(
     "grpc.default_compression_algorithm", CompressionAlgorithm.gzip
)]

channel = grpc.insecure_channel(
    "127.0.0.1:{}".format(port), options=channel_options
)
这将正确设置两侧的默认算法

通过设置
grpc内部编码请求
元数据键,可以覆盖特定调用的压缩算法:

stub.MethodName(request, metadata={'grpc-internal-encoding-request': 'gzip'})
这将最终在请求上设置
grpc编码
头,并对正文进行适当编码

到目前为止还不错。下一步:

对等点间不对称的压缩方法

gRPC对等方可以选择 使用与请求不同的压缩方法进行响应, 包括不执行任何压缩,无论信道和 RPC设置

我在这个和一个引用中找到了一个如何做到这一点的例子。但是,当我尝试执行此操作时,我在日志中看到一个错误,并且响应标头没有更改:

prepare_application_metadata: {"created":"@1541795237.323499000","description":"Unallowed duplicate metadata","file":"src/core/lib/transport/metadata_batch.cc","file_line":113,"key":"grpc-internal-encoding-request","value":"gzip"}
当服务器还设置了默认压缩算法时,会引发错误。当没有默认设置时,它似乎确实起作用

与此相关的是,被接受的回答表明,
grpc内部编码请求
只应在客户端中使用(考虑到名称,这是有意义的)

因此,我不知道是否存在无法同时设置默认值和覆盖的错误,或者设置
grpc内部编码请求
在服务器端是否真的无效(如果是,应该如何更改响应编码)

最后:

压缩的特定禁用

如果用户(通过先前的 描述的机制)在下一条消息中禁用压缩的请求 必须以未压缩的方式发送。这有助于防止 野兽/犯罪攻击。这适用于一元和流 案例

表示这是受支持的,但似乎只有
beta
包中的客户端存根支持,即使引用的提交是在2015年合并的。对这一点的支持是否还在某种路线图上,或者我是否遗漏了什么


我不必使用Python实现作为参考。是否有其他语言的更完整实现?

感谢您的详细分析。我已经为gRPC Python压缩支持的跟踪问题添加了注释:。正如您所注意到的,用于压缩的Python级API需要一些清理和添加。gRPC核心(Python包装)完全支持所有每通道/呼叫/消息压缩选项;gRPC Python需要在其配置API中公开更多选项,然后将这些设置传递给core。感谢您的发帖,如果您有其他意见,请继续关注我们的Github。谢谢@EricG。我已经订阅了Github问题以监控进度。什么替代的实现可以作为我的参考,它更完整?GRPC C++库完全实现压缩规范。谢谢@ EICCG!