Resolver problemas de falhas na API de middleware

A maioria das APIs de middleware retorna um objeto SdvResult. Em caso de sucesso, esse objeto contém o objeto de resultado esperado. Em caso de falha, esse objeto contém um objeto SdvStatus, indicando um comportamento inesperado ou uma condição de erro, geralmente identificada por um código do erro, como Internal, Unavailable ou DataLoss.

Esta página ajuda você a resolver esses códigos de erro.

Resolver problemas de registro e criação

As falhas de registro e criação geralmente surgem quando você tenta criar ou registrar um serviço inválido.

Não é possível criar o segundo serviço

Erro:

Erro Internal.

Causa:

Você está tentando registrar a mesma instância do pacote de serviços (nome e ID da instância) duas vezes.

Correção:

Não tente registrar a mesma instância de pacote de serviços (nome e ID da instância) duas vezes.

Não é possível excluir o pacote de serviços duplicado

Erro:

Status(-3, EX_ILLEGAL_ARGUMENT)

Causa:

Você está tentando excluir um pacote de serviços duplicado que não existe.

Correção:

Não tente excluir um pacote de serviços duplicado que não existe.

Não é possível recuperar uma instância de editor para enviar mensagens

Erro:

A chamada para take_publisher retorna none.

Causa:

Você chamou take_publisher duas vezes para a mesma variante da mesma instância do pacote de serviços.

Correção:

Não chame take_publisher duas vezes para a mesma variante da mesma instância do pacote de serviços.

Não é possível criar um Subscriber, Observer, History ou InstantReader

Erro:

Erro Unavailable.

Causa:

Você tentou criar um Subscriber, Observer, History ou InstantReader para um editor que não existe ou que foi cancelado.

Correção:

Verifique se o editor existe ou está registrado antes de tentar criar um Subscriber, Observer, History ou InstantReader para ele.

Não é possível criar o cliente RPC

Erro:

Unavailable erro

Causa:

Você tentou criar um cliente RPC para um nome de unidade de servidor que não existe ou não está registrado.

Correção:

Verifique se o servidor existe e está registrado antes de criar o cliente RPC.

Resolver falhas de comunicação

As falhas de comunicação podem ocorrer depois que um serviço é executado e começa a se comunicar com outros serviços.

Resolver problemas de cancelamento de registro do editor

Podem ocorrer erros quando um editor cancela o registro enquanto os leitores ainda estão ativos.

O read_next_messages do assinante retorna listas vazias

Erro:

read_next_messages é bem-sucedido, mas retorna listas vazias.

Causa:

O editor é cancelado enquanto os leitores estão ativos.

Correção:

Use um assinante ou histórico com um stream de disponibilidade. Se a última mensagem do stream de disponibilidade estiver indisponível, o editor será cancelado e não haverá novas mensagens.

O próximo retorno do observador é um erro interno

Erro:

next retorna o erro Internal.

Causa:

O editor é cancelado enquanto os leitores estão ativos.

Correção:

Use um assinante ou histórico com um stream de disponibilidade. Se a última mensagem do stream de disponibilidade não estiver disponível, o editor não existe mais e não há novas mensagens.

O read_from_history do histórico não retorna novas mensagens

Erro:

read_from_history não retorna novas mensagens, apenas as mais antigas.

Causa:

O editor é cancelado enquanto os leitores estão ativos.

Correção:

Use um assinante ou histórico com um stream de disponibilidade. Se a última mensagem do stream de disponibilidade não estiver disponível, o editor não existe mais e não há novas mensagens.

InstantReader read_latest_message retorna um erro interno

Erro:

read_latest_message retorna o erro Internal.

Causa:

O editor é cancelado enquanto os leitores estão ativos.

Correção:

Use um assinante ou histórico com um stream de disponibilidade. Se a última mensagem do stream de disponibilidade não estiver disponível, o editor não existe mais e não há novas mensagens.

Resolver problemas de fila de mensagens vazia

Podem ocorrer erros ao tentar ler uma fila de mensagens vazia.

O read_next_messages do assinante retorna uma lista vazia

Erro:

read_next_messages retorna uma lista vazia.

Causa:

O editor está ativo, mas não enviou mensagens.

Correção:

Use um assinante ou histórico com um stream de disponibilidade. Se a última mensagem do stream de disponibilidade estiver disponível, o editor estará ativo e não haverá novas mensagens.

O próximo retorno do observador é um erro interno

Erro:

next retorna o erro Internal.

Causa:

O editor está ativo, mas não enviou mensagens.

Correção:

Use um assinante ou histórico com um stream de disponibilidade. Se a última mensagem do stream de disponibilidade estiver disponível, o editor estará ativo e não haverá novas mensagens.

O read_from_history do histórico não retorna novas mensagens

Erro:

read_from_history retorna uma lista vazia.

Causa:

O editor está ativo, mas não enviou mensagens.

Correção:

Use um assinante ou histórico com um stream de disponibilidade. Se a última mensagem do stream de disponibilidade estiver disponível, o editor estará ativo e não haverá novas mensagens.

InstantReader read_latest_message retorna um erro interno

Erro:

read_latest_message retorna o erro Internal.

Causa:

O editor está ativo, mas não enviou mensagens.

Correção:

Use um assinante ou histórico com um stream de disponibilidade. Se a última mensagem do stream de disponibilidade estiver disponível, o editor estará ativo e não haverá novas mensagens.

Resolver problemas de estouro de buffer ou perda de dados

Podem ocorrer erros quando o editor envia mensagens em uma taxa mais rápida do que um leitor pode consumir.

A primeira leitura do assinante após um estouro retorna o erro DataLoss

Erro:

read_next_messages retorna o erro DataLoss.

Causa:

O editor envia mensagens em uma taxa mais rápida do que um leitor pode consumir.

Correção:

As possíveis correções são:

  • Aumente o buffer de anel do editor capacity na definição da arquitetura do VSIDL para que a fila possa absorver picos de mensagens antes que o assinante as leia.
  • Consuma mensagens com mais frequência no assinante ou reduza a taxa de mensagens do editor.
  • Use um InstantReader em vez de um Subscriber se o serviço precisar apenas do valor da mensagem mais recente e não precisar processar todas as atualizações intermediárias.

O primeiro next do observador após um estouro retorna o erro DataLoss

Erro:

next retorna o erro DataLoss.

Causa:

O editor envia mensagens em uma taxa mais rápida do que um leitor pode consumir.

Correção:

As possíveis correções são:

  • O editor publica em um ritmo mais lento. Por exemplo, você pode ter uma variável com o carimbo de data/hora da mensagem mais recente. Se o horário atual for menor que o horário de publicação mais recente mais um delta, você não publicará a mensagem. Com esse mecanismo, no máximo uma mensagem por delta é publicada.

  • O consumidor usa um objeto InstantRead em vez de um observador. Um objeto InstantRead não retorna erros de estouro e sempre retorna a última mensagem. Se a última mensagem for a única que importa para você, use um objeto InstantRead em vez de um observador.

  • O consumidor implementa a amostragem. Se a solução tiver um editor (P1) que publique mensagens mais rápido do que o observador (01) pode ler, é possível criar um novo editor (P2) e observador (02) para acomodar a diferença na velocidade de publicação e leitura.

    Por exemplo, suponha que P1 publique uma mensagem a cada 10 ms, mas O1 só possa ler uma mensagem a cada 100 ms e descarte as outras nove mensagens. Para resolver a discrepância, crie uma solução que siga estas etapas:

    1. P1 publica mensagens em O2.
    2. O O2 lê uma mensagem e descarta nove.
    3. O2 envia a mensagem lida para P2.
    4. P2 envia a mensagem lida para O1.
    5. O1 lê uma mensagem a cada dez segundos.

    O exemplo de código abaixo mostra como implementar esse cenário de amostragem:

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

As leituras do histórico estão incompletas

Erro:

A mensagem é perdida antes da cópia do histórico. Nenhuma notificação de erro direta na leitura.

Causa:

O editor envia mensagens em uma taxa mais rápida do que um leitor pode consumir.

Correção:

As possíveis correções são:

  • Aumente o buffer circular do editor capacity na definição da arquitetura VSIDL para que o History retenha mensagens recentes suficientes para o intervalo de sondagem do leitor.
  • Leia de History com mais frequência ou reduza a taxa em que o editor envia mensagens.

O InstantReader lê apenas a última mensagem

Erro:

A mensagem é perdida antes da cópia do histórico. Nenhuma notificação de erro direta na leitura.

Causa:

O editor envia mensagens em uma taxa mais rápida do que um leitor pode consumir.

Correção:

N/A

O cliente RPC chama um método, mas ele está indisponível

Erro:

A chamada de método falha com o erro Unavailable.

Causa:

O SDV não sabe o nome do servidor e retorna Unavailable. Esse erro é retornado pelo middleware se a descoberta de serviços não retornar um nome de servidor válido.

Correção:

Inicie um pacote de serviços que defina um server para a interface que o cliente quer usar.

A implementação do lado do servidor retorna o erro SdvStatus

Erro:

A implementação do lado do servidor retorna um SdvResult que contém um erro SdvStatus, como SdvStatusCode::NotFound. O erro é propagado de volta para o cliente que fez a chamada.

Causa:

O SDV e o sistema de comunicação entre o cliente e o servidor funcionam conforme o esperado, mas o cliente fez uma solicitação que aciona um erro no servidor.

Correção:

Faça uma solicitação válida com o cliente ou corrija o servidor para responder a essas solicitações.