Soluciona problemas de errores de la API de middleware

La mayoría de las APIs de middleware devuelven un objeto SdvResult. Si la operación se realiza correctamente, este objeto contiene el objeto de resultado esperado. En caso de error, este objeto contiene un objeto SdvStatus, que indica un comportamiento inesperado o una condición de error, a menudo identificado por un código de error, como Internal, Unavailable o DataLoss.

En esta página, encontrarás ayuda para solucionar problemas relacionados con estos códigos de error.

Soluciona problemas de registro y errores de creación

Por lo general, los errores de registro y creación surgen cuando intentas crear o registrar un servicio no válido.

No se puede crear el segundo servicio

Error:

Error Internal.

Causa:

Estás intentando registrar dos veces la misma instancia del paquete de servicio (nombre y ID de instancia).

Solución:

No intentes registrar dos veces la misma instancia del paquete de servicios (nombre y ID de instancia).

No se puede borrar el paquete de servicios duplicado

Error:

Status(-3, EX_ILLEGAL_ARGUMENT)

Causa:

Estás intentando borrar un paquete de servicios duplicado que no existe.

Solución:

No intentes borrar un paquete de servicios duplicado que no existe.

No se puede recuperar una instancia del publicador para enviar mensajes

Error:

La llamada a take_publisher() devuelve none.

Causa:

Llamaste a take_publisher() dos veces para la misma variante desde la misma instancia del paquete de servicios.

Solución:

No llames a take_publisher() dos veces para la misma variante desde la misma instancia del paquete de servicios.

No se pueden crear objetos Subscriber, Observer, History ni InstantReader

Error:

Error Unavailable.

Causa:

Intentaste crear un Subscriber, Observer, History o InstantReader para un publicador que no existe o que se dio de baja.

Solución:

Verifica que el publicador exista o esté registrado antes de intentar crear un objeto Subscriber, Observer, History o InstantReader para el publicador.

No se puede crear el cliente de RPC

Error:

Unavailable error

Causa:

Intentaste crear un cliente de RPC para un nombre de unidad de servidor que no existe o no está registrado.

Solución:

Verifica que el servidor exista y esté registrado antes de crear el cliente de RPC.

Soluciona problemas de fallas de comunicación

Las fallas de comunicación pueden ocurrir después de que se ejecuta un servicio y comienza a comunicarse con otros servicios.

Soluciona problemas relacionados con la cancelación del registro de publicadores

Pueden producirse errores cuando un publicador anula su registro mientras sus lectores siguen activos.

La función read_next_messages() del suscriptor devuelve listas vacías

Error:

read_next_messages() se ejecuta correctamente, pero devuelve listas vacías.

Causa:

El editor se da de baja mientras sus lectores están activos.

Solución:

Usa un suscriptor o un historial con una transmisión de disponibilidad. Si el último mensaje de la transmisión de disponibilidad no está disponible, se anula el registro del editor y no hay mensajes nuevos.

El método next() del observador devuelve un error interno

Error:

next() devuelve un error Internal.

Causa:

El editor se da de baja mientras sus lectores están activos.

Solución:

Usa un suscriptor o un historial con una transmisión de disponibilidad. Si el último mensaje de la transmisión de disponibilidad no está disponible, significa que el editor ya no está y no hay mensajes nuevos.

El método read_from_history() del historial no devuelve mensajes nuevos

Error:

read_from_history() no devuelve mensajes nuevos, solo mensajes anteriores.

Causa:

El editor se da de baja mientras sus lectores están activos.

Solución:

Usa un suscriptor o un historial con una transmisión de disponibilidad. Si el último mensaje de la transmisión de disponibilidad no está disponible, significa que el editor ya no está y no hay mensajes nuevos.

InstantReader read_latest_message() devuelve un error interno

Error:

read_latest_message() devuelve un error Internal.

Causa:

El editor se da de baja mientras sus lectores están activos.

Solución:

Usa un suscriptor o un historial con una transmisión de disponibilidad. Si el último mensaje de la transmisión de disponibilidad no está disponible, significa que el editor ya no está y no hay mensajes nuevos.

Soluciona problemas relacionados con la cola de mensajes vacía

Pueden producirse errores cuando se intenta leer desde una cola de mensajes vacía.

La función read_next_messages() del suscriptor devuelve una lista vacía

Error:

read_next_messages() devuelve una lista vacía correctamente.

Causa:

El publicador está activo, pero no envió mensajes.

Solución:

Usa un suscriptor o un historial con una transmisión de disponibilidad. Si está disponible el último mensaje de la transmisión de disponibilidad, significa que el publicador está activo y no hay mensajes nuevos.

El método next() del observador devuelve un error interno

Error:

next() devuelve un error Internal.

Causa:

El publicador está activo, pero no envió mensajes.

Solución:

Usa un suscriptor o un historial con una transmisión de disponibilidad. Si el último mensaje de la transmisión de disponibilidad está disponible, significa que el editor está activo y no hay mensajes nuevos.

El método read_from_history() del historial no devuelve mensajes nuevos

Error:

read_from_history() devuelve una lista vacía correctamente.

Causa:

El publicador está activo, pero no envió mensajes.

Solución:

Usa un suscriptor o un historial con una transmisión de disponibilidad. Si el último mensaje de la transmisión de disponibilidad está disponible, significa que el editor está activo y no hay mensajes nuevos.

InstantReader read_latest_message() devuelve un error interno

Error:

read_latest_message() devuelve un error Internal.

Causa:

El publicador está activo, pero no envió mensajes.

Solución:

Usa un suscriptor o un historial con una transmisión de disponibilidad. Si el último mensaje de la transmisión de disponibilidad está disponible, significa que el editor está activo y no hay mensajes nuevos.

Soluciona problemas de desbordamiento de búfer o pérdida de datos

Pueden producirse errores cuando el publicador envía mensajes a una velocidad mayor de la que un lector puede consumirlos.

La primera lectura del suscriptor después de un desbordamiento devuelve un error de DataLoss

Error:

read_next_message() devuelve un error DataLoss.

Causa:

El publicador envía mensajes a una velocidad mayor de la que un lector puede consumirlos.

Solución:

El primer next() del observador después de un desbordamiento devuelve un error de DataLoss

Error:

next() devuelve un error DataLoss.

Causa:

El publicador envía mensajes a una velocidad mayor de la que un lector puede consumirlos.

Solución: Estas son las posibles soluciones:

  • El publicador publica a un ritmo más lento. Por ejemplo, puedes tener una variable con la marca de tiempo del mensaje más reciente. Si la hora actual es anterior a la hora de publicación más reciente más un delta, no publiques el mensaje. Con este mecanismo, se publica como máximo un mensaje por delta.

  • El consumidor usa un objeto InstantRead en lugar de un observador. Un objeto InstantRead no devuelve errores de desbordamiento y siempre devuelve el último mensaje. Si el último mensaje es el único que te importa, puedes usar un objeto InstantRead en lugar de un observador.

  • El consumidor implementa el muestreo. Si tu solución tiene un publicador (P1) que publica mensajes más rápido de lo que el observador (O1) puede leerlos, puedes crear un nuevo publicador (P2) y un observador (O2) para adaptarse a la diferencia en la velocidad de publicación y lectura.

    Por ejemplo, supongamos que P1 publica un mensaje cada 10 ms, pero O1 solo puede leer un mensaje cada 100 ms y descarta los nueve mensajes restantes. Para resolver la discrepancia, crea una solución que siga estos pasos:

    1. P1 publica mensajes en O2.
    2. O2 lee un mensaje y descarta nueve.
    3. O2 envía el mensaje leído a P2.
    4. P2 envía el mensaje de lectura a O1.
    5. O1 lee un mensaje cada diez segundos.

    En el siguiente ejemplo de código, se muestra cómo implementar esta situación de muestreo:

    int discarded_message = 10;
    
    while (true) {
    message m = O2.read_message();
    if discarded_message == 10 {
      discarded_message = 0;
      P2.publish(m);
    } else {
     discarded_message ++;
    }
    }
    

Las lecturas del historial están incompletas

Error:

El mensaje se pierde antes de que se cree la copia del historial. No hay notificación de error directa en la lectura.

Causa:

El publicador envía mensajes a una velocidad mayor de la que un lector puede consumirlos.

Solución:

InstantReader solo lee el último mensaje

Error:

El mensaje se pierde antes de que se cree la copia del historial. No hay notificación de error directa en la lectura.

Causa:

El publicador envía mensajes a una velocidad mayor de la que un lector puede consumirlos.

Solución:

N/A

El cliente de RPC llama a un método que no está disponible

Error:

La llamada de método falla con el error Unavailable.

Causa:

El SDV no conoce el nombre del servidor y devuelve Unavailable. El middleware devuelve este error si el descubrimiento de servicios no devuelve un nombre de servidor válido.

Solución:

Inicia un paquete de servicios que define un server para la interfaz determinada que el cliente desea usar.

La implementación del servidor devuelve un error de SdvStatus

Error:

La implementación del servidor devuelve un SdvResult que contiene un error de SdvStatus, como SdvStatusCode::NotFound. El error se propaga de vuelta al cliente que realiza la llamada.

Causa:

El SDV y el sistema de comunicación entre el cliente y el servidor funcionan según lo esperado, pero el cliente realizó una solicitud que activa un error en el servidor.

Solución:

Realiza una solicitud válida con el cliente o corrige el servidor para que responda correctamente a esas solicitudes.