Получение ошибки исключения при вызове приложения: [Errno 5] Ошибка ввода/вывода иногда

Вопрос или проблема

мой файл sample.proto

syntax = "proto3";
package protofile;
import "google/protobuf/timestamp.proto";
import "google/protobuf/struct.proto";
option go_package = "./contracts/grpc";

message EventCallbackRequest {
  string event_sid = 1;
  string event_type = 2;
  string event_name = 3;
  google.protobuf.Timestamp event_timestamp = 4;
  string action_sid = 5;
  string action_custom_parameter = 6;
  google.protobuf.Struct event_data = 7;
  google.protobuf.Struct data = 8;
}

message EventCallbackResponse {
  string message = 1;
  bool success = 2;
}

service EventCallbackTriggerService {
  rpc TriggerCallbackEvent(EventCallbackRequest) returns (EventCallbackResponse) {}
}

sample_server.py

import grpc
from concurrent import futures
import sample_pb2
import sample_pb2_grpc

from google.protobuf.json_format import MessageToDict

class SampleEventHandler(sample_pb2_grpc.EventCallbackTriggerServiceServicer):
    def TriggerCallbackEvent(self, request, context):
        print("Привет----------------")
        data = MessageToDict(request)
        print(f"данные: {data}")

        return sample_pb2.EventCallbackResponse(message="Событие получено", success=True)

def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=1))
    sample_pb2_grpc.add_EventCallbackTriggerServiceServicer_to_server(SampleEventHandler(), server)

    server.add_insecure_port('[::]:50051')
    print("gRPC сервер работает на порту 50051...")
    server.start()
    server.wait_for_termination()

if __name__ == '__main__':
    serve()

sample_client.py

import grpc
from google.protobuf import struct_pb2, timestamp_pb2
import sample_pb2_grpc as pb2_grpc
import sample_pb2 as pb2
from datetime import datetime

def run():
    target2 = 'grpc-test.squadstack.com:443/protofile.EventCallbackTriggerService/TriggerCallbackEvent'

    credentials = grpc.ssl_channel_credentials()

    # Установите безопасный канал с Nginx (SSL и HTTP/2 для gRPC)
    with grpc.secure_channel(target2, credentials) as channel:
        # Создайте заглушку (клиент), чтобы делать запросы к gRPC сервису
        stub = pb2_grpc.EventCallbackTriggerServiceStub(channel)

        # Подготовьте временную метку
        event_timestamp = timestamp_pb2.Timestamp()
        event_timestamp.FromDatetime(datetime.now())

        # Подготовьте данные Struct
        event_data = struct_pb2.Struct()
        event_data["key1"] = "value1"
        event_data["key2"] = "value2"

        # Создайте запрос с необходимыми деталями события
        request = pb2.EventCallbackRequest(
            event_sid="2K8DQQuKWiXhXdfpMnXJYKV0TdB",
            event_type="leg_lifecycle_event",
            event_name="leg_incoming",
            event_timestamp=event_timestamp,
            action_sid="action-123",
            action_custom_parameter="custom-param",
            event_data=event_data,
            data={
                "account_sid": "abcd60",
                "caller_id": "XXXX",
                "contact_uri": "YYYY",
                "date_created": "2023-01-10T10:41:39.607712401Z",
                "date_updated": "2023-01-10T10:41:39.607712401Z",
                "dc_code": "101",
                "direction": "inbound",
                "exophone": "YYYY",
                "leg_sid": "2K8DQQr2eoPW6HXJej7VesxsTUy00000",
                "network_type": "pstn",
                "nso_code": "9988fd96-ce41-11ed-9a09-0242ac110003",
                "start_time": "2023-01-10T10:41:39.039873482Z",
                "state": "ringing",
                "time_limit": 14400
            }
        )

        # Отправьте запрос на gRPC сервер через Nginx и получите ответ
        try:
            response = stub.TriggerCallbackEvent(request)
            print(f"Ответ сервера: {response.message}, Успех: {response.success}")
        except grpc.RpcError as e:
            print(f"Ошибка вызова gRPC: {e}")

if __name__ == '__main__':
    run()

Я настроил конфигурацию nginx для прослушивания на порту 50051. nginx возвращает 200.

Пример ответа от nginx

{"level": "info","ts": "2024-09-18T08:18:14+00:00","message": "обработан запрос POST /protofile.EventCallbackTriggerService/TriggerCallbackEvent","request": {"id": "50bb0cfe3ba03c733693c656ad331579","remote_ip": "192.168.1.95","remote_port": "18562","protocol": "HTTP/2.0","method": "POST","scheme": "https","host": "grpc-test.squadstack.com","uri": "/protofile.EventCallbackTriggerService/TriggerCallbackEvent","headers": {"user-agent": "grpc-python/1.66.1 grpc-c/43.0.0 (osx; chttp2)","accept": "","accept-encoding": "","referer": "","x-forwarded-for": "49.249.150.126","x-forwarded-proto": "https"}},"connection": {"bytes_read": 907,"bytes_sent": 124},"timing": {"duration_msecs": 0.001,"upstream_connect_time": "0.000","upstream_header_time": "0.000","upstream_response_time": "0.000"},"response": {"status": 200,"headers": {"content_length": "0","content_type": "application/grpc"}},"upstream": {"address": "127.0.0.1:50051","status": "200","response_length": "0","cache_status": ""},"ssl": {"protocol": "TLSv1.3","cipher": "TLS_AES_128_GCM_SHA256","session_reused": ".","server_name": "","client_verify": "NONE","client_s_dn": ""},"gzip_ratio": ""}

Каждый раз, когда я запускаю sample_client.py, в 8 из 10 случаев я получаю следующую ошибку

gRPC вызов завершился с ошибкой: <_InactiveRpcError of RPC that terminated with:
    status = StatusCode.UNKNOWN
    details = "Исключение при вызове приложения: [Errno 5] Ошибка ввода/вывода"
    debug_error_string = "UNKNOWN:Ошибка получена от соперника  {grpc_message:"Исключение при вызове приложения: [Errno 5] Ошибка ввода/вывода", grpc_status:2, created_time:"2024-09-18T14:41:17.38932+05:30"}"
>
На 

в случае успеха, я получаю

Ответ сервера: Событие получено, Успех: True

Я пытался искать ошибку ввода/вывода, но не нашел ничего полезного, что могло бы помочь мне решить эту проблему. На моем сервере достаточно дискового пространства.

Мы используем сервер ubuntu для запуска sample_server.py. Я запускаю sample_client на своем локальном сервере, размещенном по адресу ‘grpc-test.squadstack.com:443/protofile.EventCallbackTriggerService/TriggerCallbackEvent’.

Требования

grpcio==1.66.1
grpcio-tools==1.66.1

Python – 3.9 как на клиенте, так и на сервере

Кто-нибудь может помочь.

Я проверил конфигурацию nginx, она возвращает 200. Получение этой ошибки ввода/вывода совершенно случайно, и я не могу понять, в чем причина.

В идеале это должно возвращать успех каждый раз, если серверный порт работает на порту 50051.

Ответ или решение

Проблема, с которой вы столкнулись, заключается в периодических ошибках ввода-вывода, которые могут быть вызваны различными причинами при взаимодействии вашего gRPC-клиента с сервером, работающим под управлением Nginx. Рассмотрим возможные причины и решения для устранения этой ошибки.

Возможные причины

  1. Сетевые проблемы:

    • Проблемы с сетью между клиентом и сервером могут привести к сбоям в соединении. Проверьте стабильность соединения и наличие потерь пакетов с помощью инструментов диагностики сетевого соединения, таких как ping или traceroute.
  2. Настройки Nginx:

    • Убедитесь, что Nginx правильно настроен для проксирования запросов gRPC. Иногда неправильные настройки могут препятствовать нормальному обмену данными. Проверьте, что вы используете правильный модуль для поддержки gRPC, и убедитесь, что ваш конфигурационный файл Nginx соответствует требованиям для gRPC.
  3. Ресурсы сервера:

    • Иногда система может не иметь достаточных ресурсов в определенные моменты времени. Проверьте, не перегружен ли ваш сервер (недостаточно памяти или процессорного времени).
  4. Обработка ошибок в приложении:
    • Добавьте дополнительные логи в sample_server.py, чтобы понять, что происходит в момент возникновения ошибки. Возможно, что ошибочные состояния или исключения обрабатываются некорректно.

Рекомендации по устранению проблемы

  1. Проверка конфигурации Nginx:
    Убедитесь, что конфигурация Nginx корректна для поддержки gRPC. Вот пример конфигурации:

    http {
       upstream grpc_backend {
           server 127.0.0.1:50051;
       }
    
       server {
           listen 443 ssl http2;
           server_name grpc-test.squadstack.com;
    
           ssl_certificate     /path/to/your/certificate.crt;
           ssl_certificate_key /path/to/your/private.key;
    
           location /protofile.EventCallbackTriggerService {
               grpc_pass grpc_backend;
               error_page 502 = /error502grpc;
           }
    
           location = /error502grpc {
               internal;
               default_type application/grpc;
               add_header grpc-status 14; # UNAVAILABLE
               add_header content-length 0;
               return 204;
           }
       }
    }

    Убедитесь, что у вас настроен error_page для обработки ошибок gRPC.

  2. Увеличение ресурсов:
    Если ваш сервер сталкивается с ограничениями по ресурсам, рассмотрите возможность увеличения количества воркеров или ресурсов, используемых вашим приложением.

  3. Обработка исключений:
    Добавьте обработку исключений в вашем методе TriggerCallbackEvent, чтобы ловить и логировать возможные ошибки:

    def TriggerCallbackEvent(self, request, context):
       try:
           print("hiiiiiiii----------------")
           data = MessageToDict(request)
           print(f"data is {data}")
           return sample_pb2.EventCallbackResponse(message="Event received", success=True)
       except Exception as e:
           print(f"Error processing request: {e}")
           context.set_details(str(e))
           context.set_code(grpc.StatusCode.INTERNAL)
           return sample_pb2.EventCallbackResponse(message="Internal server error", success=False)
  4. Мониторинг:
    Настройте систему мониторинга для отслеживания метрик производительности и состояния системы, чтобы вы могли лучше понимать, когда и почему возникают ошибки.

Заключение

Если вы испробовали все вышеперечисленные рекомендации и проблема не исчезла, возможно, потребуется более глубокий анализ сети или инфраструктуры. Также может быть полезно задать более конкретные вопросы на форумах по gRPC или обратиться за помощью к системному администратору, который сможет провести аудит вашей системы.

Оцените материал
Добавить комментарий

Капча загружается...