Как установить тайм-аут в библиотеке gRPC Python

У меня есть сервер / клиент grpc, который сегодня иногда зависает, вызывая проблемы. Это вызывается из приложения Flask, которое проверяет фоновый рабочий процесс, чтобы убедиться, что он жив / функционирует. Чтобы сделать запрос к серверу gRPC, у меня есть:

try:
        health = self.grpc_client.Health(self.health_ping)
        if health.message == u'PONG':
            return {
                u'healthy': True,
                u'message': {
                    u'healthy': True,
                    u'message': u'success'
                },
                u'status_code': 200
            }
except Exception as e:
        if str(e.code()) == u'StatusCode.UNAVAILABLE':
            return {
                u'healthy': False,
                u'message': {
                    u'healthy': False,
                    u'message': (u'[503 Unavailable] connection to worker '
                                 u'failed')},
                u'status_code': 200}
        elif str(e.code()) == u'StatusCode.INTERNAL':
            return {
                u'healthy': False,
                u'message': {
                    u'healthy': False,
                    u'message': (u'[500 Internal] worker encountered '
                                 u'an error while responding')},
                u'status_code': 200}
        return {
            u'healthy': False,
            u'message': {u'healthy': False, u'message': e.message},
            u'status_code': 500
        }

клиент - заглушка:

channel = grpc.insecure_channel(address)
stub = WorkerStub(channel)
return stub

прото:

syntax = "proto3";

option java_multiple_files = true;
option java_package = "com.company.project.worker";
option java_outer_classname = "ProjectWorker";
option objc_class_prefix = "PJW";

package projectworker;

service Worker {
  rpc Health (Ping) returns (Pong) {}
}

// The request message containing PONG
message Ping {
  string message = 1;
}

// The response message containing PONG
message Pong {
  string message = 1;
}

Используя этот код, как мне добавить тайм-аут, чтобы я всегда мог ответить, а не потерпел неудачу и завис?


person kkirsche    schedule 09.05.2017    source источник


Ответы (3)


timeout - необязательный параметр ключевого слова при вызове RPC, поэтому вы должен измениться

health = self.grpc_client.Health(self.health_ping)

to

health = self.grpc_client.Health(self.health_ping, timeout=my_timeout_in_seconds)

.

person Nathaniel Manista At Google    schedule 09.05.2017
comment
Ах хорошо. Большое вам спасибо за эту информацию! Не могу поверить, что я это пропустил - person kkirsche; 09.05.2017
comment
Здесь есть синонимичный параметр для параметров канала github.com/grpc/grpc/blob/v1.36.x/include/grpc/impl/codegen/? это grpc.grpclb_call_timeout_ms? - person spacether; 26.03.2021

Вы также можете захотеть перехватить и обработать тайм-ауты иначе, чем другие ошибки. К сожалению, документация по этой теме не очень хороша, поэтому вот что у вас есть:

try:
    health = self.grpc_client.Health(self.health_ping, timeout=my_timeout_in_seconds)
except grpc.RpcError as e:
    e.details()
    status_code = e.code()
    status_code.name
    status_code.value

Тайм-аут вернет DEADLINE_EXCEEDED status_code.value.

person user582175    schedule 19.07.2019

Чтобы определить тайм-аут на стороне клиента, добавьте необязательный параметр timeout=<timeout in seconds> при вызове служебной функции;

channel = grpc.insecure_channel(...)
stub = my_service_pb2_grpc.MyServiceStub(channel)
request = my_service_pb2.DoSomethingRequest(data='this is my data')
response = stub.DoSomething(request, timeout=0.5)

???? Обратите внимание, что ситуация тайм-аута вызовет исключение.

person Jossef Harush    schedule 20.09.2019