"Connection reset by peer" в python gRPC

Мы отправляем множество запросов на сервер gRPC. Но время от времени мы сталкиваемся с ошибкой "Connection reset by peer" с UNAVAILABLE статусом.

GRPC server: NestJS

Client: Python

Python version: 3.8

gRPCio version: 1.50.0

Код:

# Connect to server from client:

def connect_to_user_manager_server() -> AuthorizationControllerStub:
    channel = grpc.insecure_channel(envs.USER_MANAGER_GRPC_URL, options=(
        ('grpc.keepalive_time_ms', 120000),
        ('grpc.keepalive_permit_without_calls', True),
    ))
    stub = AuthorizationControllerStub(channel)

    return stub

client = connect_to_user_manager_server()

user_response = client.CheckAuthorization(authorizationData(authorization=token, requiredRoles=roles))

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

Например, вы можете реализовать логику повторной попытки с помощью библиотеки retrying:

from retrying import retry

@retry(stop_max_attempt_number=3, wait_fixed=1000)
def connect_to_user_manager_server():
    channel = grpc.insecure_channel(envs.USER_MANAGER_GRPC_URL, options=(
        ('grpc.keepalive_time_ms', 120000),
        ('grpc.keepalive_permit_without_calls', True),
    ))
    stub = AuthorizationControllerStub(channel)
    return stub

При этом функция connect_to_user_manager_server будет повторена до 3 раз, с задержкой в 1 секунду между каждым повтором.

Вы также можете реализовать это вручную, используя цикл и блок try-catch, например, так:

attempt = 1
max_attempts = 3
while attempt <= max_attempts:
    try:
        channel = grpc.insecure_channel(envs.USER_MANAGER_GRPC_URL, options=(
            ('grpc.keepalive_time_ms', 120000),
            ('grpc.keepalive_permit_without_calls', True),
        ))
        stub = AuthorizationControllerStub(channel)
        break
    except Exception as e:
        if attempt == max_attempts:
            raise e
        attempt += 1
        time.sleep(1)

Это также повторит соединение с сервером до 3 раз, с задержкой в 1 секунду между каждым повтором.

Вы можете настроить количество повторных попыток и время задержки в соответствии с вашими потребностями.

Вернуться на верх