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>
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!
[...] mi anterior artículo de blog, vimos los errores lanzados por clientes libCouchbase como ruby, python, C y C++. Este blog [...]