Используйте RetryPolicy с клиентом python GRPC

#grpc #grpc-python

#grpc #grpc-python

Вопрос:

Я очень старался использовать встроенную RetryPolicy документации GRPC (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)
  

Может кто-нибудь указать мне соответствующую документацию, чтобы я понял, как это работает, или объяснил мне, что я неправильно понимаю?

Ответ №1:

У меня была такая же проблема с синтаксисом конфигурации.

Я нашел это.

Короче говоря, RetryPolicy должен быть указан как часть 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)])
  

где <package> и <service> определены в вашем файле proto.