¡Por fin está disponible el Couchbase .NET SDK 2.1.0 GA! Esta versión es una versión menor para 2.1.0, pero incluye soporte para el Patrón de Asincronía de Tareas (palabras clave async y await) e IO no bloqueante para todas las operaciones Clave/Valor. Además, se han incluido otras características:
- Ajustes KEEP_ALIVE TCP por conexión
- Nuevos puntos de ampliación para crear transcodificadores, serializadores y conversores "enchufables".
- Soporte de "Get and Touch" para el deslizamiento de vencimientos en pares clave/valor.
- Soporte oficial para el método "la llave existe
Otras mejoras y correcciones de errores incluyen una corrección de las lecturas de réplica, un nuevo motor de petición de consultas para gestionar las incoherencias y los errores durante los escenarios de intercambio/reequilibrio/recuperación y una plétora de otras correcciones de errores y mejoras (más de 45 tickets de Jira cerrados). ¡Esta versión es JUGGED!
En las próximas dos secciones repasaré brevemente las principales funciones de esta versión; en un futuro próximo se publicarán artículos más extensos en los que se profundizará en cada una de ellas.
Patrón de asincronía de tareas compatible con K/V
Todo el motor IO ha sido renovado en esta versión para soportar IO no bloqueante; para aprovechar esta característica la hemos expuesto a través de las palabras clave async y await. Si no estás familiarizado con las palabras clave async/await y el TAP (Task Asynchrony Pattern), puede que quieras saltar y leer esteo esteo este antes de continuar.
Sin entrar en demasiados detalles (habrá una inmersión profunda en otro, futuro post), he aquí un ejemplo de uso de async/await y el SDK de Couchbase para insertar y recuperar una clave de un cluster de Couchbase:
La primera diferencia que notarás es que la firma del método ahora tiene la palabra clave async añadida; esto hará posible usar la palabra clave await dentro del cuerpo del método. Cuando el método se ejecute, lo hará de forma síncrona hasta que llegue a la palabra clave await, entonces será "levantado" y se ejecutará de forma asíncrona. Hay un poco de magia de compilador involucrada aquí en el lado .NET, ¡pero eso es todo lo que necesitas hacer para escribir código asíncrono usando el SDK .NET de Couchbase!
Dentro del SDK .NET de Couchbase, se creará una tarea y se almacenará en la cola; la petición se enviará al servidor de Couchbase de una manera "disparar y olvidar" (a través de IOCP) y cuando se complete se lanzará un callback que completará la solicitud mediante la lectura de la respuesta y la devolverá a la persona que llama. Si se produce un error o una excepción, se gestionará y se devolverá como la implementación IOperationResult que encapsula la tarea. Una vez más, ¡espera una profundización en un futuro post!
Nuevos puntos de ampliación
Uno de los objetivos del SDK 2.0 era proporcionar puntos de ampliación para los distintos componentes del SDK; si no le gusta nuestra implementación o la API externa en la que se basa, ¡escriba la suya propia! Otro efecto positivo secundario es que facilita el aislamiento y las pruebas de las distintas capas y componentes del SDK.
En 2.1.1, ahora admitimos tres nuevos puntos de ampliación:
- Serializadores - manejar la serialización y deserialización de POCOs a JSON.
- Convertidores - gestionar la conversión de los paquetes de bytes de Memcached que van y vienen del servidor Couchbase (y la paridad entre los otros SDK)
- Transcodificadores - se encargan de la conversión y serialización/deserialización del cuerpo de la solicitud o respuesta (la parte "valor" de "clave/valor").
Para crear un serializador personalizado se implementa la interfaz ITypeSerializer y se proporciona una función Func
Los convertidores y transcodificadores personalizados también se pueden conectar implementando las interfaces ITypeConverter o ITypeTranscoder y proporcionando una clase personalizada que gestione su caso de uso o necesidad específica. Al igual que en el caso de los serializadores, se proporciona una clase Func
En futuras entradas profundizaremos en estas extensiones e ilustraremos cómo construir e inyectar nuevos comportamientos de transcodificación, serialización y/o conversión en el cliente.
Otras novedades de la versión 2.1.0
Ajustes por conexión para TCP KEEP-ALIVES
La configuración por defecto del sistema operativo para TCP KEEP-ALIVES en Windows es de 120 minutos. En algunos casos, tales como despliegues en la nube donde los dispositivos de red (balanceadores de carga, etc) se han configurado para matar las conexiones TCP que han estado inactivas durante un período de tiempo más corto, necesitamos una manera de establecer el TCP KEEP-ALIVES por defecto a un período de tiempo menor. Usted puede hacer esto globalmente a nivel del sistema operativo a través de la configuración del Registro a través de KeepAliveInterval y KeepAliveTime, sin embargo, esto afectará a todas las aplicaciones que se ejecutan en ese servidor. Una mejor solución es cambiar el intervalo y el tiempo a nivel de conexión TCP para que sólo se aplique a las conexiones que el cliente está utilizando.
Ahora es posible hacerlo a través de las propiedades EnableTcpKeepAlives, TcpKeepAliveTime y TcpKeepAliveInterval de la clase ClientConfiguration. EnableTcpKeepAlives habilitará o deshabilitará TCP KEEP-ALIVES (por defecto está habilitado), TcpKeepAliveTime es el tiempo que transcurrirá antes de que se envíen KEEP-ALIVES y TcpKeepAliveInterval es el intervalo entre KEEP-ALIVES una vez alcanzado el TcpKeepAliveTime.
En el ejemplo anterior, antes de crear el objeto Cluster y abrir un bucket desde él, creamos una ClientConfiguration y establecemos EnableTcpKeepAlives a true (ten en cuenta que el valor por defecto es true, así que esto es sólo para ilustrar), el TcpKeepAliveTime se establece en 1hr (esto es cuando el primer paquete KEEP-ALIVE se enviará si la conexión está inactiva), y finalmente establecemos el TcpKeepAliveInterVal a 5secs. Lo que esto significa es que después de 1hr de inactividad, el cliente comenzará a enviar KEEP-ALIVES TCP cada 5segundos hasta que la conexión se active de nuevo.
Compatibilidad con el método Exists
Los usuarios piden a menudo una forma de comprobar que una clave existe sin tener que recuperar el valor. Ahora tenemos este soporte en la v2.1.0. Se admiten las versiones síncrona y asíncrona de este método.
Soporte para GAT (Get and Touch) y Touch (para vencimientos deslizantes)
Se han introducido dos nuevos métodos: GetAndTouch y Touch. GetAndTouch recuperará un valor y actualizará su caducidad y Touch actualizará la caducidad de una clave, pero no devolverá ningún valor.
Corrección de errores importantes
- Transcodificación de números enteros de 1.3.X a 2.X
- Correcciones para la lectura de réplicas
- Muchísimas correcciones de errores y mejoras.
Cómo obtener el SDK .NET de Couchbase
El SDK puede descargarse directamente, a través de NuGet, o clonando y extrayendo el repositorio de Github: