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