En algún momento, toda aplicación tendrá que hacer frente a una excepción: los errores de ejecución se producen de forma inesperada y tu aplicación debe saber cómo tratarlos y recuperarse. Siempre es bueno que la gestión de errores sea transparente para el usuario final, pero, como mínimo, una buena gestión de errores debería resolver el problema, dar suficiente información al usuario sobre qué hacer a continuación y salir del programa con elegancia. Si has puesto mucho esfuerzo en escribir tu aplicación personalizada, ¿por qué dejar que un error de ejecución lo arruine todo? Este blog explica qué significan los diferentes códigos de retorno en los clientes derivados de libCouchbase (Ruby, PHP, Python, C/C++) y qué debe hacer tu aplicación cuando se encuentre con uno de ellos..

Los clientes de Couchbase son inteligente. Esto significa que son consciente de la topología del clúster - si un nodo falla, el cliente es consciente de ello. Si se añade un nuevo nodo al cluster, el cliente también es consciente de este nuevo nodo. En comparación con los clientes memcached, los clientes inteligentes proporcionan un mejor rendimiento y disponibilidad durante los fallos, enrutando automáticamente las peticiones al servidor Couchbase correcto. Los clientes inteligentes se derivan de libcouchbase (Ruby, Python, Perl, node.js y PHP) o están escritos en un lenguaje nativo como Java y .NET. Este blog cubrirá los códigos de error devueltos por los clientes libcouchbase.

Las aplicaciones utilizan APIs de clientes inteligentes para enviar peticiones a Couchbase. Couchbase escucha en 4 puertos - 11210 (puerto directo), 11211 (puerto proxy), 8091 (consola de administración) y 8092 (vistas de couchbase). Una vez conectados, los clientes pueden enviar un flujo de peticiones en la misma conexión al servidor. Los mensajes de petición suelen incluir una cabecera binaria memcached de 24 bytes y una carga útil que es opcional. La longitud de la carga útil se especifica en la cabecera. Las mutaciones de documentos van primero a la caché gestionada por objetos y luego se replican y persisten de forma asíncrona. Couchbase devuelve un éxito (0) o un fallo (código de error distinto de cero) tan pronto como el documento se añade a la caché gestionada por objetos. El código de retorno indica el éxito o fracaso global de la llamada al API.

Es una buena práctica de programación comprobar los códigos de error en tu aplicación para saber cuándo reintentar la petición o lanzar un error de usuario. La siguiente tabla enumera los códigos de error en Couchbase y sugiere lo que los clientes deben hacer si se encuentran con un error que aparece en la lista :

Si utiliza un cliente derivado de libCouchbase como Ruby, Python, Perl, node.js y PHP, los siguientes son algunos de los códigos de error que puede ver:

Código de error recibido

¿Qué significa?

¿Qué debe hacer el cliente?

LCB_SUCCESS Operación concluida con éxito No hacer nada. Couchbase ha ejecutado correctamente la solicitud del cliente.
LCB_AUTH_ERROR Error de autenticación. Se ha proporcionado un nombre de usuario o contraseña no válidos Compruebe el nombre de usuario y la contraseña suministrados. Los clientes deben volver a intentarlo con el nombre de usuario y la contraseña correctos.
LCB_DELTA_BADVAL

 

La operación no puede ejecutarse con los argumentos solicitados. Comprueba los argumentos y la operación que se ejecuta sobre los argumentos.

Por ejemplo: Incremento de un valor no numérico mediante el incr o incremento por un valor no numérico

LCB_E2BIG El servidor ha informado de que el objeto es demasiado grande El tamaño máximo de clave en Couchbase es de 250 bytes. Tamaño máximo de documento en Couchbase es 20Mb.

 

El cliente debe reintentar y utilizar objetos con tamaños dentro de estos límites.

LCB_EBUSY El servidor está demasiado ocupado para atender sus peticiones en este momento. Utiliza el backoff en el código de tu aplicación y vuelve a intentar la operación pasado un tiempo.
LCB_EINTERNAL Hay un error interno dentro de la biblioteca. Destruye el contexto de conexión y crea uno nuevo.
LCB_EINVAL Argumentos no válidos especificados Asegúrate de pasar los argumentos correctos
LCB_ENOMEM El servidor no tiene memoria Esto puede ocurrir durante la presión de memoria cuando los documentos en memoria aún no se han volcado al disco. Retrocede y vuelve a intentarlo pasado un tiempo.
LCB_RANGE Rango no válido especificado Asegúrese de haber especificado los rangos adecuados
LCB_ETMPFAIL El servidor intentó realizar la operación pero falló debido a una restricción temporal Retrocede y vuelve a intentarlo pasado un tiempo.
LCB_KEY_EEXISTS La clave ya existe (con otro valor CAS) Las claves son únicas en Couchbase. Prueba con otra clave.
LCB_KEY_ENOENT La clave no existe No se ha encontrado la llave. Intente buscar otra llave.
LCB_NETWORK_ERROR Se ha producido un problema relacionado con la red Soluciona el problema de la red y vuelve a intentarlo.
LCB_NOT_MY_VBUCKET El servidor que ha recibido esta solicitud ya no es responsable de este objeto. Esto ocurre durante los cambios de topología del clúster o el reequilibrio. El cliente obtiene automáticamente un nuevo mapa de clústeres del servidor y aprende dónde debe enviar las solicitudes posteriores.

 

En libcouchbaseEn realidad, este error no se expone al usuario. La biblioteca gestiona automáticamente la reconexión al servidor correcto.

 

Vuelva a intentar la operación transcurrido un tiempo.

LCB_NOT_STORED El objeto no estaba almacenado en el servidor Utiliza el backoff en el código de tu aplicación y vuelve a intentar la operación pasado un tiempo.
LCB_NOT_SUPPORTED El servidor no soporta el comando solicitado. Compruebe la solicitud enviada al servidor.
LCB_UNKNOWN_COMMAND El servidor no sabe cuál es el comando. Compruebe la solicitud enviada al servidor.
LCB_HOST_DESCONOCIDO El servidor no ha podido resolver el nombre de host solicitado Compruebe el nombre de host especificado.
LCB_PROTOCOLO_ERROR Hay algo incorrecto en el flujo de datos recibido por el servidor El conjunto de resultados debe descartarse y no utilizarse. El cliente debe reintentar la operación.
LCB_ETIMEOUT La operación del servidor ha finalizado Esto puede ocurrir si un servidor del cluster falla y Couchbase aún tiene que detectar este fallo.

El cliente debe reintentarlo pasado un tiempo.

LCB_CONNECT_ERROR El cliente no ha podido conectarse al servidor solicitado El cliente debe reintentarlo pasado un tiempo.
LCB_BUCKET_ENOINT El cubo solicitado no existe Comprueba si el bucket existe en el servidor y vuelve a intentarlo.
LCB_CLIENT_ENOMEM El cliente se quedó sin memoria Esto puede ocurrir si los contextos de conexión no se liberan correctamente en el lado del cliente. Destruye el contexto de conexión actual y vuelve a intentarlo.
LCB_CLIENT_ETMPFAIL El cliente ha encontrado un error temporal. La aplicación puede volver a intentarlo pasado un tiempo.
LCB_SERVER_BUG El uso inesperado del protocolo del servidor causó resultados inesperados. El conjunto de resultados debe descartarse y no utilizarse.

 

El desarrollador debe registrar sus pasos para reproducir el problema y archivar un error.

LCB_INVALID_HOST_FORMAT La lista de hosts de arranque utilizaba un formato no válido/no admitido. Compruebe el formato de nombre de host utilizado, corríjalo y vuelva a intentarlo.
LCB_INVALID_CHAR Carácter no válido utilizado en el componente path de una URL Asegúrese de que la ruta URL está codificada correctamente.

Después de recibir un código de error de Couchbase, las aplicaciones pueden convertir estos códigos en una cadena - como se muestra en el fragmento de código de ejemplo a continuación, lcb_strerror() devuelve una cadena terminada en 0 que representa el error.

        #incluir <libcouchbase/couchbase.h>

        …
        fprintf(stdout, "La cadena textual para LCB_SUCCESS es: %sn,
        lcb_strerror(NULL, LCB_SUCCESS));
        …

No importa lo seguro que estés, no puedes predecir todos los problemas que te puedes encontrar. Sin un mecanismo para comprobar errores, podrías pensar que Couchbase no funciona correctamente. Asegúrate de comprobar los códigos de error en tu aplicación para saber por qué se producen los errores. 

¡Buena suerte construyendo tus aplicaciones en Couchbase!

Autor

Publicado por Don Pinto, Director Principal de Producto, Couchbase

Don Pinto es Gerente Principal de Producto en Couchbase y actualmente está enfocado en avanzar las capacidades de Couchbase Server. Es un apasionado de la tecnología de datos, y en el pasado ha escrito varios artículos sobre Couchbase Server, incluyendo blogs técnicos y libros blancos. Antes de unirse a Couchbase, Don pasó varios años en IBM, donde desempeñó el papel de desarrollador de software en el grupo de gestión de la información DB2 y, más recientemente, como director de programa en el equipo de SQL Server en Microsoft. Don tiene un máster en informática y una licenciatura en ingeniería informática por la Universidad de Toronto, Canadá.

1 Comentarios

  1. [...] mi anterior artículo de blog, vimos los errores lanzados por clientes libCouchbase como ruby, python, C y C++. Este blog [...]

Dejar una respuesta