Todo aplicativo acabará tendo que lidar com uma exceção - erros de tempo de execução ocorrem inesperadamente e seu aplicativo deve saber como lidar com eles e se recuperar. É sempre bom quando o tratamento de erros é transparente para o usuário final, mas, no mínimo, um bom tratamento de erros deve solucionar o problema, fornecer informações suficientes ao usuário sobre o que fazer em seguida e encerrar o programa de forma elegante. Se você se esforçou muito para escrever seu aplicativo personalizado, por que deixar que um erro de tempo de execução estrague tudo? Este blog explica o que os diferentes códigos de retorno significam nos clientes derivados da libCouchbase (Ruby, PHP, Python, C/C++) e o que seu aplicativo deve fazer quando encontrar um deles.
Os clientes do Couchbase são inteligente. Isso significa que eles são reconhecimento da topologia do cluster - se um nó falhar, o cliente estará ciente disso. Se um novo nó for adicionado ao cluster, o cliente também estará ciente desse novo nó. Em comparação com os clientes memcached, os clientes inteligentes oferecem melhor desempenho e disponibilidade durante as falhas, encaminhando automaticamente as solicitações para o servidor Couchbase correto. Os clientes inteligentes são derivados de libcouchbase (Ruby, Python, Perl, node.js e PHP) ou são escritos em uma linguagem nativa, como Java e .NET. Este blog abordará os códigos de erro retornados pelos clientes da libcouchbase.
Os aplicativos usam APIs de clientes inteligentes para enviar solicitações ao Couchbase. O Couchbase escuta em 4 portos - 11210 (porta direta), 11211 (porta proxy), 8091 (console administrativo) e 8092 (exibições do couchbase). Uma vez conectados, os clientes podem enviar um fluxo de solicitações na mesma conexão com o servidor. As mensagens de solicitação normalmente incluem um cabeçalho binário do memcached de 24 bytes e uma carga útil que é opcional. O comprimento da carga útil é especificado no cabeçalho. As mutações de documentos vão primeiro para o cache gerenciado por objeto e, em seguida, são replicadas e persistidas de forma assíncrona. O Couchbase retorna um sucesso (0) ou uma falha (código de erro diferente de zero) assim que o documento é adicionado ao cache gerenciado por objeto. O código de retorno indica o sucesso ou a falha geral da chamada à API.
É uma boa prática de programação verificar os códigos de erro em seu aplicativo para saber quando tentar novamente a solicitação ou lançar um erro de usuário. A tabela abaixo lista os códigos de erro no Couchbase e sugere o que os clientes devem fazer se encontrarem um erro listado:
Se você estiver usando um cliente derivado da libCouchbase tais como Ruby, Python, Perl, node.js e PHP, a seguir estão alguns dos códigos de erro que você pode ver:
Código de erro recebido |
O que isso significa? |
O que o cliente deve fazer? |
LCB_SUCCESS | Operação bem-sucedida | Não fazer nada. O Couchbase executou com êxito a solicitação do cliente. |
LCB_AUTH_ERROR | Falha na autenticação. Nome de usuário ou senha inválidos foram fornecidos | Verifique o nome de usuário e a senha fornecidos. Os clientes devem tentar novamente com o nome de usuário e a senha corretos. |
LCB_DELTA_BADVAL
|
A operação não pode ser executada com os argumentos solicitados. | Verifique os argumentos e a operação que está sendo executada nos argumentos.
Por exemplo: Incrementar um valor não numérico usando o incr ou incrementar por um valor não numérico |
LCB_E2BIG | O servidor informou que o objeto é muito grande | O tamanho máximo da chave no Couchbase é de 250 bytes. O tamanho máximo do documento no Couchbase é de 20 Mb.
O cliente deve tentar novamente e usar objetos com tamanhos dentro desses limites. |
LCB_EBUSY | O servidor está muito ocupado para atender às suas solicitações no momento. | Use o backoff no código do seu aplicativo e tente novamente a operação após algum tempo. |
LCB_EINTERNAL | Há um erro interno na biblioteca. | Destrua o contexto de conexão e crie um novo. |
LCB_EINVAL | Argumentos inválidos especificados | Certifique-se de passar os argumentos corretos |
LCB_ENOMEM | O servidor está sem memória | Isso pode ocorrer durante a pressão da memória, quando os documentos na memória ainda não foram transferidos para o disco. Faça um backoff e tente novamente após algum tempo. |
LCB_RANGE | Intervalo inválido especificado | Certifique-se de ter especificado os intervalos adequados |
LCB_ETMPFAIL | O servidor tentou executar a operação, mas falhou devido a uma restrição temporária | Recuar e tentar novamente após algum tempo. |
LCB_KEY_EEXISTS | A chave já existe (com outro valor CAS) | As chaves são exclusivas no Couchbase. Tente outra chave. |
LCB_KEY_ENOENT | A chave não existe | A chave não foi encontrada. Tente procurar outra chave. |
LCB_NETWORK_ERROR | Ocorreu um problema relacionado à rede | Solucione o problema de sua rede e tente novamente. |
LCB_NOT_MY_VBUCKET | O servidor que recebeu essa solicitação não é mais responsável por esse objeto. Isso acontece durante alterações na topologia do cluster ou no rebalanceamento. | O cliente obtém automaticamente um novo mapa de cluster do servidor e fica sabendo para onde deve enviar as solicitações subsequentes.
Na libcouchbaseEsse erro não é realmente exposto ao usuário. A biblioteca gerencia automaticamente a reconexão com o servidor correto.
Tente novamente a operação após algum tempo. |
LCB_NOT_STORED | O objeto não foi armazenado no servidor | Use o backoff no código do seu aplicativo e tente novamente a operação após algum tempo. |
LCB_NOT_SUPPORTED | O servidor não é compatível com o comando solicitado. | Verifique a solicitação enviada ao servidor. |
LCB_UNKNOWN_COMMAND | O servidor não sabe qual é o comando. | Verifique a solicitação enviada ao servidor. |
LCB_UNKNOWN_HOST | O servidor não conseguiu resolver o nome de host solicitado | Verifique o nome do host especificado. |
LCB_PROTOCOL_ERROR | Há algo errado no fluxo de dados recebido pelo servidor | O conjunto de resultados deve ser descartado e não deve ser usado. O cliente deve tentar novamente a operação. |
LCB_ETIMEOUT | A operação do servidor atingiu o tempo limite | Isso pode ocorrer se um servidor no cluster falhar e o Couchbase ainda tiver que detectar essa falha.
O cliente deve tentar novamente após algum tempo. |
LCB_CONNECT_ERROR | O cliente não conseguiu se conectar ao servidor solicitado | O cliente deve tentar novamente após algum tempo. |
LCB_BUCKET_ENOINT | O bucket solicitado não existe | Verifique se o bucket existe no servidor e tente novamente. |
LCB_CLIENT_ENOMEM | O cliente ficou sem memória | Isso pode ocorrer se os contextos de conexão não forem liberados corretamente no lado do cliente. Destrua o contexto de conexão atual e tente novamente. |
LCB_CLIENT_ETMPFAIL | O cliente encontrou um erro temporário. | O aplicativo pode tentar novamente após algum tempo. |
LCB_SERVER_BUG | O uso inesperado do protocolo do servidor causou resultados inesperados. | O conjunto de resultados deve ser descartado e não deve ser usado.
O desenvolvedor deve registrar suas etapas para reproduzir o problema e registrar um bug. |
LCB_INVALID_HOST_FORMAT | A lista de hosts bootstrap usou um formato inválido/não suportado. | Verifique o formato do nome do host usado, corrija-o e tente novamente. |
LCB_INVALID_CHAR | Caractere inválido usado no componente de caminho de um URL | Verifique se o caminho do URL está codificado corretamente. |
Depois de receber um código de erro do Couchbase, os aplicativos podem converter esses códigos em uma cadeia de caracteres - conforme mostrado no trecho de código de exemplo abaixo, lcb_strerror() retorna uma cadeia de caracteres com terminação 0 que representa o erro.
#incluir <libcouchbase/couchbase.h>
Por mais confiante que você esteja, não é possível prever todos os problemas que poderá encontrar. Sem um mecanismo para verificar se há erros, você pode pensar que o Couchbase não funciona corretamente. Certifique-se de verificar os códigos de erro em seu aplicativo para saber por que os erros ocorrem.
Boa sorte na criação de seus aplicativos no Couchbase!
[Em meu artigo anterior do blog, examinamos os erros lançados pelos clientes da libCouchbase, como ruby, python, C e C++. Este blog [...]