Hay muchos casos de uso en los que la caducidad automática de documentos funciona perfectamente. Mantener el estado de la sesión, carritos de la compra, cotizaciones de precios para viajes y mucho más. En todos estos casos, las aplicaciones que utilizan Couchbase Server, establecen el tiempo de caducidad en segundos, minutos u horas para gestionar el comportamiento del usuario.
Para los elementos con caducidad en la base de datos, Couchbase Server ha incorporado inteligencia para hacer que los datos desaparezcan a la hora de caducidad dada. Puedes encontrar todo sobre TTL y expiración aquí en la documentación de Couchbase Server. La mayoría de estos sistemas con caducidad también presentan casos de uso en los que se desea renovar los datos que caducan o notificar a un sistema posterior que un conjunto de documentos está a punto de caducar. La renovación o las notificaciones de datos que caducan suelen implicar un proceso que busca los próximos vencimientos de los documentos. La consulta de esta información es ahora mucho más rápida gracias a los índices globales y a N1QL. |
|
En el pasado, se podía indexar esta información en vistas map/reduce. Aunque las vistas map/reduce pueden proporcionar una indexación potente, debido a la dispersión de las colecciones, los índices globales tienen ventaja.
He aquí por qué: Los índices globales se particionan independientemente de los datos. Por ejemplo, aunque tengas tus datos repartidos en 20 nodos, los índices globales pueden residir en un único nodo si el índice cabe en ese único nodo. Tampoco tienes que elegir el mismo HW para los nodos de índice vs datos en Couchbase Server. Eso significa que puedes conseguir un nodo de índice que sea lo suficientemente "alto" para que quepa el índice. Puedes leer más sobre las diferencias entre vistas map/reduce e índices secundarios globales aquí.
A continuación se explica cómo indexar y consultar la información de caducidad para detectar los datos que caducan: Usaré .Net en los ejemplos.
Paso 1 Incluir la expiración en el cuerpo del documento: no necesitarás hacer esto en el futuro pero hoy, META() no expone la expiración todavía. En el código de abajo añade un atributo exp_datetime al JSON que calcula la hora aproximada en la que expirará el documento. (Recuerde que este es un sistema distribuido y no hay hora central. Los relojes estarán ligeramente desfasados entre los nodos cliente y servidor por lo que la hora exacta de expiración es difícil de detectar)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
... cbDoc = nuevo Documento { Id = Llave, Contenido = nuevo { a1 = _a1, ... exp_datetime = FechaHora.UtcNow.AñadirMilisegundos(30000) } }; //UPSERTAR cbDoc.Caducidad = 30000; var upsert = cbBucket.Upsert(cbDoc); ... |
Paso 2 - Crear un índice sobre la hora de expiración.
1 |
CREAR ÍNDICE iExpiration EN por defecto(exp_datetime) USO DE GSI; |
Paso 3 - Consultar datos que expiran en los próximos 30 segundos. La siguiente consulta devolverá los ID de los documentos y los valores completos de los documentos.
1 2 3 4 |
SELECCIONE META(por defecto).id, * DESDE por defecto DONDE DATE_DIFF_STR(STR_TO_UTC(exp_datetime),MILLIS_TO_UTC(DATE_ADD_MILLIS(AHORA_MILLIS(),30,"segundo")),"segundo") < 30 Y STR_TO_UTC(exp_datetime) IS NO FALTA; |
La salida contendrá todos los documentos que caduquen en los próximos 30 segundos.
Feliz pirateo