A maioria das APIs de middleware retorna um objeto SdvResult. Se a operação for bem-sucedida, esse objeto
vai conter 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 de 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 ocorrem 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 duas vezes a mesma instância de pacote de serviços (nome e ID da instância).
Correção:
Não tente registrar duas vezes a mesma instância de pacote de serviços (nome e ID da instância).
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 problemas de comunicação
Falhas de comunicação podem ocorrer depois que um serviço é executado e começa a se comunicar com outros serviços.
Resolver problemas com o cancelamento do registro de publishers
Erros podem ocorrer 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() é executado com êxito, 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 fluxo de disponibilidade não estiver disponível, o publisher será cancelado e não haverá novas mensagens.
O next() do observador retorna 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 terá desaparecido e não haverá novas mensagens.
O read_from_history() do histórico não retorna novas mensagens
Erro:
read_from_history() não retorna mensagens novas, apenas mensagens 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 terá desaparecido e não haverá novas mensagens.
InstantReader read_latest_message() retorna 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 terá desaparecido e não haverá novas mensagens.
Resolver problemas de fila de mensagens vazia
Erros podem ocorrer ao tentar ler de 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 fluxo de disponibilidade estiver disponível, o editor estará ativo e não haverá novas mensagens.
O next() do observador retorna 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 fluxo 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 fluxo de disponibilidade estiver disponível, o editor estará ativo e não haverá novas mensagens.
InstantReader read_latest_message() retorna 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 fluxo 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
Os erros podem ocorrer 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 um erro de DataLoss
Erro:
read_next_message() retorna o erro DataLoss.
Causa:
O editor envia mensagens em uma taxa mais rápida do que um leitor pode consumir.
Correção:
O primeiro next() do observador após um estouro retorna um erro de 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:possíveis correções:
O publisher publica em uma taxa mais lenta. Por exemplo, você pode ter uma variável com o carimbo de data/hora da mensagem mais recente. Se a hora atual for menor que a última hora de publicação mais um delta, não publique a mensagem. Usando esse mecanismo, no máximo uma mensagem por delta é publicada.
O consumidor usa um objeto
InstantReadem vez de um observador. Um objetoInstantReadnão retorna erros de estouro e sempre retorna a última mensagem. Se a última mensagem for a única importante para você, use um objetoInstantReadem vez de um observador.O consumidor implementa a amostragem. Se a solução tiver um editor (P1) que publica mensagens mais rápido do que o observador (01) consegue ler, você poderá 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 nove mensagens restantes. Para resolver a discrepância, crie uma solução que siga estas etapas:
- P1 publica mensagens em O2.
- O2 lê uma mensagem e descarta nove.
- O2 envia a mensagem lida para P2.
- P2 envia a mensagem lida para O1.
- O1 lê uma mensagem a cada dez segundos.
O exemplo de código a seguir 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. Não há notificação direta de erro na leitura.
Causa:
O editor envia mensagens em uma taxa mais rápida do que um leitor pode consumir.
Correção:
O InstantReader só lê a última mensagem
Erro:
A mensagem é perdida antes da cópia do histórico. Não há notificação direta de erro 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 não está disponível
Erro:
A chamada de método falha com o erro Unavailable.
Causa:
A 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 define um server para a interface especificada que o
cliente quer usar.
A implementação do lado do servidor retorna um 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 ao
cliente de chamada.
Causa:
A SDV e o sistema de comunicação entre cliente e servidor funcionam como 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.