"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 секунду между каждым повтором.
Вы можете настроить количество повторных попыток и время задержки в соответствии с вашими потребностями.