«Сброс соединения по узлу» в 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))
1 ответ
Вы можете добавить логику повторных попыток в свой клиентский код, используя библиотеку, такую как повторные попытки, или реализовав ее вручную.
Например, вы можете реализовать логику повторных попыток, используя библиотеку повторных попыток:
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
Это повторит попытку
Вы также можете реализовать это вручную, используя цикл и блок 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 секунду между каждой повторной попыткой.
Вы можете настроить количество повторных попыток и время задержки в соответствии с вашими потребностями.