Couchbase Functions está siendo introdujo en la versión 5.5 de Couchbase Server bajo la etiqueta Servicio de eventos Couchbase. Couchbase Functions te da la capacidad de mover la lógica de negocio basada en datos más cerca de tus datos. La lógica empresarial definida por el usuario puede activarse en tiempo real en el servidor cuando los datos cambian como resultado de las interacciones que se producen en las aplicaciones web y de borde. Cuando la computación reside más cerca de los datos, es importante entender cómo se comporta la computación cuando los datos, que está escuchando, cambian. Intentaremos entender cómo reacciona el Servicio de Eventos al orden de las mutaciones.
Empecemos y entendamos el comportamiento con un ejemplo sencillo. Vamos a crear una función de prueba con el siguiente código y asumir la configuración por defecto (es decir, 3 trabajadores) para la función.
1 2 3 4 5 6 7 8 9 |
función OnUpdate(doc, meta) { registro(Creado Doc ID:', meta.id); } función OnDelete(meta) { registro("ID de documento eliminado:, meta.id); } |
Nota: Elija "Todo" en el límite de alimentación en todas las operaciones siguientes durante el despliegue de la función.
En el cubo de origen que escucha esta función, vamos a insertar unos 10 documentos con IDs numéricos crecientes. En el archivo de registro de la aplicación para esta Función, verá algo similar a las siguientes entradas.
1 2 3 4 5 6 7 8 9 10 |
2018-05-13T11:36:05.163-04:00 [INFO] "Creado Doc ID:" "2" 2018-05-13T11:36:05.163-04:00 [INFO] "Creado Doc ID:" "3" 2018-05-13T11:36:05.163-04:00 [INFO] "Creado Doc ID:" "9" 2018-05-13T11:36:05.163-04:00 [INFO] "Creado Doc ID:" "8" 2018-05-13T11:36:05.164-04:00 [INFO] "Creado Doc ID:" "1" 2018-05-13T11:36:05.164-04:00 [INFO] "Creado Doc ID:" "0" 2018-05-13T11:36:05.165-04:00 [INFO] "Creado Doc ID:" "5" 2018-05-13T11:36:05.165-04:00 [INFO] "Creado Doc ID:" "4" 2018-05-13T11:36:05.165-04:00 [INFO] "Creado Doc ID:" "7" 2018-05-13T11:36:05.165-04:00 [INFO] "Creado Doc ID:" "6" |
Try undeploying and deploying the above Function and we observe that ordering of the IDs(/changes) is not the same. Puede repetir este paso varias veces para reforzar esta observación.
1 2 3 4 5 6 7 8 9 10 |
2018-05-13T11:59:17.504-04:00 [INFO] "Creado Doc ID:" "8" 2018-05-13T11:59:17.504-04:00 [INFO] "Creado Doc ID:" "9" 2018-05-13T11:59:17.504-04:00 [INFO] "Creado Doc ID:" "3" 2018-05-13T11:59:17.504-04:00 [INFO] "Creado Doc ID:" "2" 2018-05-13T11:59:17.505-04:00 [INFO] "Creado Doc ID:" "1" 2018-05-13T11:59:17.505-04:00 [INFO] "Creado Doc ID:" "0" 2018-05-13T11:59:17.507-04:00 [INFO] "Creado Doc ID:" "4" 2018-05-13T11:59:17.507-04:00 [INFO] "Creado Doc ID:" "7" 2018-05-13T11:59:17.507-04:00 [INFO] "Creado Doc ID:" "6" 2018-05-13T11:59:17.507-04:00 [INFO] "Creado Doc ID:" "5" |
Retorno#1 : La función no procesa los documentos en el orden en que fueron insertados.
Ahora, borremos uno de los documentos insertados (en nuestro ejemplo, he borrado DocId#2). Inmediatamente observamos la siguiente entrada en el registro (que es correcta):
1 |
2018-05-13T11:43:10.165-04:00 [INFO] "ID de documento eliminado:" "2" |
Ahora, Despleguemos la Función y Volvamos a Desplegarla. Observamos el siguiente orden:
1 2 3 4 5 6 7 8 9 10 |
2018-05-13T11:44:04.808-04:00 [INFO] "Creado Doc ID:" "8" 2018-05-13T11:44:04.808-04:00 [INFO] "ID de documento eliminado:" "2" 2018-05-13T11:44:04.809-04:00 [INFO] "Creado Doc ID:" "1" 2018-05-13T11:44:04.809-04:00 [INFO] "Creado Doc ID:" "0" 2018-05-13T11:44:04.809-04:00 [INFO] "Creado Doc ID:" "3" 2018-05-13T11:44:04.809-04:00 [INFO] "Creado Doc ID:" "9" 2018-05-13T11:44:04.810-04:00 [INFO] "Creado Doc ID:" "4" 2018-05-13T11:44:04.810-04:00 [INFO] "Creado Doc ID:" "7" 2018-05-13T11:44:04.810-04:00 [INFO] "Creado Doc ID:" "6" 2018-05-13T11:44:04.810-04:00 [INFO] "Creado Doc ID:" "5" |
Observamos que:
- "Falta "Created Doc ID:" "2
- "Doc ID borrado:" "2" aparece antes en el orden de procesamiento y no después.
Comida para llevar#2 : Desduplicación
Las operaciones sucesivas (/cambios/mutaciones) a un documento son coalescenciadas (dedup'ed), cuando ocurren en rápida sucesión, por el Servidor Couchbase para que la sobrecarga en el disco y la memoria sea minimizada. Couchbase Server envía sólo la última versión de un documento en el flujo DCP.
En el ejemplo anterior, esta es la razón por la que el manejador OnUpdate no se dispara ya que el borrado del DocID fue el último en la secuencia de operaciones en el documento; esto es, cuando UPDATE y DELETE ocurren en orden, entonces se unen en DELETE, que ocurre más tarde en la línea de tiempo. Es decir, cuando múltiples Actualizaciones (o incluso una sola Actualización) a un documento son seguidas por el Borrado del documento, entonces sólo el evento de Borrado es visto por las Funciones de Couchbase, ya que las actualizaciones se unen en el evento final - que es el Borrado del documento.
Un comportamiento similar se verá, si un documento sufre múltiples actualizaciones en una ventana pequeña, y luego una Función consume los cambios; sólo el último cambio que ocurra en el documento se verá y los cambios intermedios se perderán. Este es el caso sólo cuando una nueva función se despliega en un cubo existente con muchos cambios que ocurren a un cubo.
Si la Función es desplegada y ocurren cambios en un documento, entonces cada cambio será manejado por la Función. Pero, si el número de cambios que ocurren a un documento es muy alto en un intervalo de tiempo pequeño, Couchbase Server todavía hace alguna cantidad de Deduplicación; y esto podría llevar a que no todos los cambios activen la Función.
Es decir, si 10 documentos fueron Insertados y uno de ellos Eliminado, entonces cuando una Función es desplegada, no está garantizado que la operación de Eliminación (en el Documento Insertado y luego en el Eliminado) sea vista al final por la Función.
Take-Away#3 : La función no procesa las mutaciones en el orden en que fueron realizadas.
¿Qué está pasando aquí? En Parte 2 de esta serie de blogs, nos sumergiremos bajo el capó del Servicio de Eventing de Couchbase y entenderemos cómo los Eventing Workers procesan las mutaciones.