将 retryPolicy 与 python GRPC 客户端一起使用

cp2*_*587 7 grpc grpc-python

我真的很努力地尝试使用 GRPC 文档的嵌入 retryPolicy(https://github.com/grpc/proposal/blob/master/A6-client-retries.md#retry-policy),但我不明白我应该在哪里在我的代码中设置配置。
理想情况下,我希望 python 客户端指定其重试策略,但我也有兴趣了解如何从服务器端管理它。

经过一番挖掘,我想出了这个剪断,但它不起作用。

import json
from grpc import insecure_channel

service_default_config = {
    # see https://github.com/grpc/proposal/blob/master/A6-client-retries.md#retry-policy-capabilities
    "retryPolicy": {
        "maxAttempts": 5,
        "initialBackoff": "1s",
        "maxBackoff": "10s",
        "backoffMultiplier": 2,
        "retryableStatusCodes": [
            "RESOURCE_EXHAUSTED",
            "UNAVAILABLE"
        ]
    }
}
service_default_config = json.dumps(service_default_config)

options = [
    ('grpc.service_config', service_default_config)
]

insecure_channel(hostname, options=options)
Run Code Online (Sandbox Code Playgroud)

谁能指出我的相关文档,让我了解这是如何工作的,或者向我解释我的误解?

小智 9

我对配置的语法也有同样的问题。

我找到了这个

简而言之,必须将 retryPolicy 指定为 methodConfig 的一部分,该 methodConfig 描述如何处理对特定服务的调用:

import json
import grpc

json_config = json.dumps(
    {
        "methodConfig": [
            {
                "name": [{"service": "<package>.<service>"}],
                "retryPolicy": {
                    "maxAttempts": 5,
                    "initialBackoff": "0.1s",
                    "maxBackoff": "10s",
                    "backoffMultiplier": 2,
                    "retryableStatusCodes": ["UNAVAILABLE"],
                },
            }
        ]
    }
)

address = 'localhost:50051'

channel = grpc.insecure_channel(address, options=[("grpc.service_config", json_config)])
Run Code Online (Sandbox Code Playgroud)

其中<package><service>是在您的原型文件中定义的。