Nota importante: esta entrada del blog contiene información sobre una función CURL de previsualización para desarrolladores en Eventos. La función CURL cambiará en Couchbase Server 6.5, por favor vea Uso de cURL con el servicio Eventing: Actualización para más detalles.
Eventing es un nuevo servicio disponible en Couchbase Server. Los Cincinnati Reds están interesados en utilizar esta función para atender más rápidamente a sus clientes VIP. Se asigna un conserje a uno o más VIPs. Cuando el VIP entre en el estadio, se enviará un mensaje de texto al conserje. El conserje puede entonces recibir al VIP en su asiento.
Como prueba de concepto, he creado un ejemplo que utiliza Funciones (parte de Eventing) para enviar un mensaje de texto. Estoy usando un cuenta de prueba de Twilio para enviar los mensajes. I no saber si los Rojos planean utilizar Twilio o mensajes de texto en su sistema de producción. Pero es gratis y fácil empezar a usar Twilio, así que eso es lo que decidí usar en mi prueba de concepto. Puedes utilizar cualquier servicio de mensajería/notificación que desees (en su lugar) siempre que tenga una API HTTP.
Revisión del concurso completo
No voy a dar aquí todos los detalles sobre la organización de eventos. Mis colegas ya han escrito mucho sobre este tema. No dudes en consultar sus artículos para obtener más información:
Pero la historia corta es esta: Couchbase Functions (parte de Eventing) te permite escribir funciones JavaScript que responden a documentos creados/actualizados/borrados. Dentro de estas funciones, puedes leer documentos, escribir documentos (a otros buckets), ejecutar consultas N1QL, y ejecutar un rizo
para realizar peticiones a puntos finales HTTP. Nota: La construcción curl está todavía en Desarrollo. Esta función está pensada únicamente para fines de desarrollo y no debe utilizarse en entornos de producción.
Voy a juntar piezas de las entradas de blog anteriores para crear esta prueba de concepto de eventing para los rojos.
Escaneado de billetes
El primer paso es escanear el billete del cliente en la puerta de embarque. He escrito un programa para simular esto. Creará un documento "ticketscan" aleatorio en un bucket "tickets" en Couchbase.
Antes de escanear los billetes, tenía que rellenar el cubo con algunos datos.
He decidido que los clientes del 1 al 9 son los VIP, y cualquier otro cliente es un "cliente normal".
1 2 3 4 5 6 7 8 9 |
_bucket.Upsert("cliente::1", nuevo { Nombre = "George Clooney" }); _bucket.Upsert("cliente::2", nuevo { Nombre = "Josh Hutcherson" }); _bucket.Upsert("cliente::3", nuevo { Nombre = "Darius Rucker" }); _bucket.Upsert("cliente::4", nuevo { Nombre = "Brooklyn Decker" }); _bucket.Upsert("cliente::5", nuevo { Nombre = "Eddie Vedder" }); _bucket.Upsert("cliente::6", nuevo { Nombre = "Nick Lachey" }); _bucket.Upsert("cliente::7", nuevo { Nombre = "Nick Goepper" }); _bucket.Upsert("cliente::8", nuevo { Nombre = "Johnny Bench" }); _bucket.Upsert("cliente::9", nuevo { Nombre = "Ryan Collins" }); |
Nota divertida: todos estos VIP son auténticos fans de los Reds.
También creé 3 conserjes y repartí a los VIP entre ellos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
_bucket.Upsert("conserje::1", nuevo { Nombre = "Matt Groves", CellNumber = _suNúmeroVerificado, vips = nuevo Lista<cadena> { "cliente::1", "cliente::2", "cliente::9" } }); _bucket.Upsert("conserje::2", nuevo { Nombre = "Sr. Redlegs", CellNumber = _suNúmeroVerificado, vips = nuevo Lista<cadena> { "cliente::3", "cliente::4", "cliente::5" } }); _bucket.Upsert("conserje::3", nuevo { Nombre = "Rosie Red", CellNumber = _suNúmeroVerificado, vips = nuevo Lista<cadena> { "cliente::6", "cliente::7", "cliente::8" } }); |
En el ejemplo anterior, asigno los clientes 1, 2 y 9 a "Matt Groves". Esto significa que George Clooney, Josh Hutcherson y Ryan Collins son los clientes VIP que el conserje Matt Groves debe atender. (Sustituir _suNúmeroVerificado
con el número de teléfono que has confirmado con Twilio).
También estoy almacenando las credenciales de Twilio en un documento. Hice esto porque necesitaré las credenciales dentro de una función de Couchbase, y no quería codificarlas allí. El documento de credenciales tiene este aspecto:
1 2 3 4 5 6 |
{ "url": "https://api.twilio.com/2010-04-01/Accounts//Messages.json", "nombre de usuario": "", "contraseña": "", "fromNumber": "" } |
He creado una aplicación de consola que creará un nuevo documento "ticketscan". Cuando lo ejecutes, puedes elegir crear un escaneo VIP o un escaneo "normal".
1 2 3 4 |
Consola.WriteLine("1 - Simular un escaneo de entradas VIP".); Consola.WriteLine("2 - Simular el escaneo de un billete normal".); Consola.WriteLine("Q - Finalizar simulación".); var elección = Consola.LeerClave().KeyChar; |
Un documento de ticketscan sólo contiene tres campos: el ID del documento del cliente, una marca de tiempo y un número de asiento.
1 |
_bucket.Upsert(ticketScanId, nuevo {CustomerId = customerId, Marca de tiempo = ticketScanTimestamp, Asiento = seatInformation }); |
Puede encontrar el código fuente completo en Github.
Función de eventos
El núcleo de este ejemplo de eventing es la función. Cuando creé esta función, la llamé "notifyConcierge"; utilicé un bucket "tickets_metadata" (como se muestra a continuación). Y lo que es más importante, creé un alias para el bucket "tickets" y lo llamé "src". Dentro de la función, este bucket es de sólo lectura, pero lo necesito para obtener información sobre el cliente y el conserje, así como las credenciales de Twilio.
En La función completa puede consultarse en Github. He aquí el desglose de la función, paso a paso:
1 - ¿El documento mutado es un ticketscan? Si lo es, proceda. Si no, esta función puede ignorarlo.
1 |
si (meta.id.indexOf("ticketscan::") !== -1) { |
2 - ¿El cliente que ha escaneado este billete es un VIP? Si es así, obtenga los datos del conserje y proceda. En caso contrario, ignóralo. Fíjate en el N1QL en línea en esta parte de la función. Esta es una característica única del tipo de JavaScript utilizado en las funciones de Couchbase.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
deje customerId = doc.customerId; deje stmt = SELECCIONE t.cellNumber, t.nombre DESDE entradas t DONDE CUALQUIER v EN t.vips SATISFACE v == $customerId FIN; //llamar al conserje (sólo debería haber uno) deje conserje = null; para (var registro de stmt) { conserje = registro; } // sólo procede a la notificación si // el cliente tiene un conserje si (conserje) { |
3 - Obtener los datos del VIP.
1 |
deje cliente = src[customerId]; |
4 - Obtener credenciales Twilio.
1 |
deje twilioCredentials = src["twilio::credenciales]; |
5 - Cree un mensaje (con el nombre del VIP, el número de asiento y el nombre del conserje). datos
es el mínimo necesario para utilizar la API de Twilio.
1 2 3 |
deje mensaje = "Hola" + conserje.nombre + "'. Un VIP asignado a usted acaba de registrarse. '" + cliente.nombre + "" estará en "" + doc.asiento + "'"; deje de = twilioCredentials.fromNumber; deje datos = "To=" + conserje.cellNumber + "&From=" + de + "&Body=" + mensaje; |
6 - Enviar un mensaje de texto al conserje utilizando Twilio API. La construcción curl está todavía en Desarrollo. Esta función está pensada únicamente para fines de desarrollo y no debe utilizarse en entornos de producción.
1 2 3 |
deje url = twilioCredentials.url; deje auth = twilioCredentials.nombre de usuario + ": " + twilioCredentials.contraseña; var resultado = rizo(url, { "datos": datos, "cabecera": ["Content-Type: x-www-form-urlencoded"], "método": "POST", "auth": auth }); |
Concurso completo en acción
Ahora, cada vez que se cree o modifique un documento de ticketscan, un conserje recibirá una notificación en su teléfono móvil. Aquí tienes un ejemplo de la demo completa, desde el escaneo del ticket hasta la notificación por SMS:
En esta imagen, estoy creando 4 escaneos de entradas. El primero es para un VIP, los dos siguientes son para Joes normales y el último es para un VIP. Aparecen dos mensajes de texto. En realidad, aparecerían en teléfonos diferentes, pero estoy enviando todas las notificaciones a un único número para hacer pruebas. Nota: Estoy utilizando únete.me para mostrar mi pantalla de Android en vivo lado a lado con la consola).
Si te encuentras con algún problema, la buena noticia es que la depuración está disponible para Funciones en Couchbase. Puedes establecer puntos de interrupción en el JavaScript y recorrerlo usando una herramienta como Chrome. Para más información, echa un vistazo a la Anuncio de concurso.
Resumen
Con esta función ejecutándose en el sistema de eventos de Couchbase, cada nuevo ticketscan para un VIP activará una notificación por mensaje de texto. Ten en cuenta que el sistema de escaneo de tickets no necesita saber nada sobre Twilio, siempre y cuando los datos terminen en Couchbase. Además, si cualquier otro el sistema está creando documentos de ticketscan, el SMS se activará allí también. La lógica es cerrar a los datos.
Con esto termino mi serie de posts sobre los Cincinnati Reds (por ahora). Los otros dos posts de la serie fueron:
- Nifi Processing y Flow con Couchbase Server - Así es como los Reds van a introducir los datos de escaneado de entradas en Couchbase.
- Visualización de datos con Couchbase y Knowi - Este es otro caso de uso para el que los Reds están estudiando utilizar los datos de escaneado de entradas.
Deja un comentario a continuación o búscame en Twitter @mgroves. ¡Vamos Rojos!
¡Buena entrada y buen momento del blog!
Cómo registrar/depurar errores en la función. Básicamente, si no funciona - dónde depurar.
Para obtener información sobre registro y depuración, consulte https://docs.couchbase.com/server/6.0/eventing/eventing-debugging-and-diagnosability.html (sustitúyalo por 6.5 si utiliza la versión beta).