es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error de “Stream Removed” de Firestore después de 3 minutos sin hacer nada.

Estoy trabajando en una aplicación de Windows Form en .NET que utiliza Google Cloud Firestore como base de datos. He creado funciones (utilizando las funciones del paquete NuGet Google.Cloud.Firestore) para leer/escribir documentos de la base de datos. Todo funciona muy bien, pero si la aplicación no utiliza ninguna de estas funciones de lectura/escritura durante más de 2-3 minutos, obtengo el siguiente error: Grpc.Core.RpcException: 'Status(StatusCode="Unknown", Detail="Stream removed". Sin embargo, si se utilizan las funciones de lectura/escritura cada 1-2 minutos, no se produce este error en un corto período de tiempo. Puedo crear una función de subproceso para mantener activa la conexión con la base de datos, pero esto genera lecturas o escrituras innecesarias. ¿Cómo puedo resolverlo?

Para reproducir el error:

string Path = AppDomain.CurrentDomain.BaseDirectory + @"AdminSDKName.json";
Environment.SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS", Path);
FirestoreDb DataBase = FirestoreDb.Create("DatabaseID");
Query QRef = DataBase.Collection("CollectionID").Document("DocID").Collection("CollectionID").WhereEqualTo("isTrue", false);
QuerySnapshot snap = await QRef.GetSnapshotAsync();
Console.WriteLine(snap.Count.ToString());
Console.WriteLine("Esperando 5 minutos...");
Task.Delay(300000).Wait();
Console.WriteLine("Esperado 5 minutos");
snap = await QRef.GetSnapshotAsync();
Console.WriteLine(snap.Count.ToString());
Console.WriteLine("Hecho sin errores.");

Obtengo el error después de la línea “Esperado 5 minutos”.

Actualización:

Si conecto mi computadora a la red del teléfono móvil, no obtengo ningún error.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El mensaje de error Grpc.Core.RpcException: 'Status(StatusCode="Unknown", Detail="Stream removed" indica que el flujo gRPC entre el cliente y el servidor fue cerrado abruptamente por uno de los lados. Esto podría ser debido a un problema de red, un problema del lado del servidor o que el cliente no esté enviando ningún dato durante un largo período de tiempo.

    En este caso, parece que el cliente no está enviando ningún dato al servidor durante un período de tiempo, lo que provoca el cierre del flujo. Una solución es mantener la conexión activa enviando periódicamente un mensaje de ping o latido al servidor. Sin embargo, como se mencionó, esto provocará lecturas o escrituras innecesarias.

    Otra solución es aumentar el tiempo de espera del lado del servidor para las conexiones inactivas. Esto se puede hacer configurando las opciones grpc.keepalive_time y grpc.keepalive_timeout al crear el canal gRPC. La opción grpc.keepalive_time especifica el período de tiempo después del cual se envía un ping de latido al servidor, y la opción grpc.keepalive_timeout especifica el período de tiempo después del cual la conexión se cierra si no se recibe respuesta del servidor. Al aumentar estos valores, el servidor tolerará períodos más largos de conexión inactiva del cliente sin cerrar el flujo.

    Código de ejemplo para configurar las opciones grpc.keepalive_time y grpc.keepalive_timeout:

    var canal = new Channel("localhost", 50051, ChannelCredentials.Insecure, new[]{
        new ChannelOption("grpc.keepalive_time", 5000),
        new ChannelOption("grpc.keepalive_timeout_ms", 1000)
    });
    

    Además de estas soluciones, también se recomienda revisar los registros del cliente y del servidor en busca de cualquier error o advertencia que pueda indicar la causa del cierre del flujo.

Comments are closed.