Observação importante: esta postagem do blog contém informações sobre uma função CURL de visualização do desenvolvedor em Eventos. A função CURL será alterada no Couchbase Server 6.5, consulte Usando cURL com o Eventing Service: Atualização para obter mais detalhes.
Eventing é um novo serviço disponível no Couchbase Server. O Cincinnati Reds está interessado em usar esse recurso para atender mais rapidamente aos seus clientes VIP. Um concierge é atribuído a um ou mais VIPs. Quando o VIP entra no estádio, uma mensagem de texto é enviada ao concierge. O concierge pode então encontrar o VIP em seus assentos.
Como prova de conceito, criei um exemplo que usa Functions (parte de Eventing) para enviar uma mensagem de texto. Estou usando um conta de teste do Twilio para enviar as mensagens. I não não sei se os Reds planejam usar o Twilio ou mensagens de texto em seu sistema de produção. Mas é gratuito e fácil começar a usar o Twilio, então foi isso que decidi usar em minha prova de conceito. Você pode usar qualquer serviço de mensagem/notificação que desejar (em vez disso), desde que ele tenha uma API HTTP.
Revisão de eventos
Não vou fornecer todos os detalhes sobre eventos aqui. Meus colegas já falaram bastante sobre isso em seus blogs. Definitivamente, dê uma olhada em suas postagens para obter mais detalhes:
Mas a história resumida é a seguinte: O Couchbase Functions (parte do Eventing) permite que você escreva funções JavaScript que respondem a documentos que são criados/atualizados/excluídos. Dentro dessas funções, você pode ler documentos, gravar documentos (em outros buckets), executar consultas N1QL e executar um enrolar para fazer solicitações a pontos de extremidade HTTP. Observação: a construção curl ainda está em desenvolvimento. Esse recurso destina-se apenas a fins de desenvolvimento e não deve ser usado em ambientes de produção.
Vou reunir partes das publicações do blog acima para criar essa prova de conceito de eventos para os Reds.
Digitalização de bilhetes
A primeira etapa é escanear o bilhete do cliente no portão. Escrevi um programa para simular isso. Ele criará um documento "ticketscan" aleatório em um compartimento "tickets" no Couchbase.
Antes de digitalizar os tíquetes, eu precisava preencher previamente o balde com alguns dados.
Decidi que os clientes de 1 a 9 são os VIPs, e qualquer outro cliente é um "cidadão comum".
|
1 2 3 4 5 6 7 8 9 |
_bucket.Upsert("customer::1", novo { Nome = "George Clooney" }); _bucket.Upsert("customer::2", novo { Nome = "Josh Hutcherson" }); _bucket.Upsert("customer::3", novo { Nome = "Darius Rucker" }); _bucket.Upsert("customer::4", novo { Nome = "Brooklyn Decker" }); _bucket.Upsert("customer::5", novo { Nome = "Eddie Vedder" }); _bucket.Upsert("customer::6", novo { Nome = "Nick Lachey" }); _bucket.Upsert("customer::7", novo { Nome = "Nick Goepper" }); _bucket.Upsert("customer::8", novo { Nome = "Johnny Bench" }); _bucket.Upsert("customer::9", novo { Nome = "Ryan Collins" }); |
Observação divertida: esses VIPs são todos torcedores reais dos Reds!
Também criei 3 concierges e dividi os VIPs entre eles.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
_bucket.Upsert("concierge::1", novo { Nome = "Matt Groves", CellNumber = _seuNúmeroVerificado, vips = novo Lista<string> { "customer::1", "customer::2", "customer::9" } }); _bucket.Upsert("concierge::2", novo { Nome = "Sr. Redlegs", CellNumber = _seuNúmeroVerificado, vips = novo Lista<string> { "customer::3", "customer::4", "customer::5" } }); _bucket.Upsert("concierge::3", novo { Nome = "Rosie Red", CellNumber = _seuNúmeroVerificado, vips = novo Lista<string> { "customer::6", "customer::7", "customer::8" } }); |
No exemplo acima, estou atribuindo os clientes 1, 2 e 9 a "Matt Groves". Isso significa que George Clooney, Josh Hutcherson e Ryan Collins são os VIPs para os quais o concierge Matt Groves está designado a cuidar. (Substituir _seuNúmeroVerificado com o número de telefone que você confirmou com o Twilio).
Também estou armazenando as credenciais do Twilio em um documento. Fiz isso porque precisarei das credenciais dentro de uma função do Couchbase e não queria codificá-las de forma rígida. O documento de credenciais tem a seguinte aparência:
|
1 2 3 4 5 6 |
{ "url": "https://api.twilio.com/2010-04-01/Accounts//Messages.json", "nome de usuário": "", "senha": "", "fromNumber": "" } |
Criei um aplicativo de console que criará um novo documento "ticketscan". Ao executá-lo, você pode optar por criar uma varredura VIP ou uma varredura "normal".
|
1 2 3 4 |
Console.WriteLine("1 - Simular uma verificação de ingresso VIP."); Console.WriteLine("2 - Simule um escaneamento de bilhete normal."); Console.WriteLine("Q - Finalizar simulação."); var escolha = Console.ReadKey().KeyChar; |
Um documento do ticketcan contém apenas três campos: a ID do documento do cliente, um registro de data e hora e um número de assento.
|
1 |
_bucket.Upsert(ticketScanId, novo {CustomerId = customerId, Carimbo de data/hora = ticketScanTimestamp, Assento = seatInformation }); |
Você pode encontrar o código-fonte completo no Github.
Função de eventos
O núcleo desse exemplo de eventos é a função. Quando criei essa função, chamei-a de "notifyConcierge"; usei um compartimento "tickets_metadata" (conforme a figura abaixo). Mais importante ainda, criei um alias para o compartimento "tickets" e o chamei de "src". Na função, esse compartimento é somente leitura, mas preciso dele para obter informações do cliente e do concierge, bem como as credenciais do Twilio.

O A função completa pode ser visualizada no Github. Aqui está o detalhamento da função, passo a passo:
1 - O documento alterado é um ticketcan? Se for, prossiga. Caso contrário, essa função pode ignorá-lo.
|
1 |
se (meta.id.indexOf("ticketscan::") !== -1) { |
2 - O cliente que escaneou esse bilhete é um VIP? Se for, obtenha os detalhes do concierge e prossiga. Caso contrário, ignore-o. Observe o N1QL em linha nesta parte da função. Esse é um recurso exclusivo da variante de JavaScript usada nas funções do Couchbase.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
deixar customerId = doc.customerId; deixar stmt = SELECIONAR t.cellNumber, t.nome DE ingressos t ONDE QUALQUER v IN t.vips SATISFAÇÕES v == $customerId FIM; //chamar o concierge (deve haver apenas um) deixar concierge = nulo; para (var registro de stmt) { concierge = registro; } // somente prosseguir com a notificação se // o cliente tem um concierge se (concierge) { |
3 - Obtenha os detalhes do VIP.
|
1 |
deixar cliente = src[customerId]; |
4 - Obtenha as credenciais do Twilio.
|
1 |
deixar twilioCredentials = src["twilio::credentials"]; |
5 - Construa uma mensagem (contendo o nome do VIP, o número do assento e o nome do concierge). dados é o mínimo necessário para usar a API do Twilio.
|
1 2 3 |
deixar mensagem = "Olá '" + concierge.nome + "'. Um VIP designado para você acabou de fazer o check-in. '" + cliente.nome + "' estará em '" + doc.assento + "'"; deixar de = twilioCredentials.fromNumber; deixar dados = "To=" + concierge.cellNumber + "&From=" + de + "&Body=" + mensagem; |
6 - Envie uma mensagem de texto para o concierge usando a API do Twilio. A construção curl ainda está em desenvolvimento. Esse recurso destina-se apenas a fins de desenvolvimento e não deve ser usado em ambientes de produção.
|
1 2 3 |
deixar url = twilioCredentials.url; deixar autenticação = twilioCredentials.nome de usuário + ": " + twilioCredentials.senha; var resultado = enrolar(url, { "dados": dados, "cabeçalho": ["Content-Type: x-www-form-urlencoded"], "método": "POST", "auth": autenticação }); |
Eventos em ação
Agora, sempre que um documento do ticketscan for criado ou modificado, um concierge será notificado em seu telefone celular. Veja a seguir um exemplo de toda a demonstração, desde a digitalização do tíquete até a notificação por SMS:

Nesta imagem, estou criando quatro digitalizações de tíquetes. O primeiro é para um VIP, os dois seguintes são para os Joões comuns e o último é para um VIP. Aparecem duas mensagens de texto. Na realidade, elas apareceriam em telefones diferentes, mas estou enviando todas as notificações para um único número para teste. Observação: Estou usando join.me para mostrar minha tela ativa do Android lado a lado com o console).
Se você estiver enfrentando problemas, a boa notícia é que a depuração está disponível para o Functions no Couchbase. Você pode definir pontos de interrupção no JavaScript e percorrê-lo usando uma ferramenta como o Chrome. Para saber mais sobre isso, consulte a seção Postagem de anúncio de eventos.
Resumo
Com essa função em execução no sistema de eventos do Couchbase, cada novo escaneamento de tíquetes para um VIP acionará uma notificação por mensagem de texto. Observe que o sistema de verificação de tíquetes não precisa saber nada sobre o Twilio, desde que os dados acabem no Couchbase. Além disso, se qualquer outro o sistema estiver criando documentos de verificação de tíquetes, o SMS também será acionado lá. A lógica é próximo para os dados.
Isso encerra minha série de postagens sobre o Cincinnati Reds (por enquanto). As outras duas postagens da série foram:
- Processamento e fluxo Nifi com o servidor Couchbase - É assim que os Reds realmente colocarão os dados de escaneamento de ingressos no Couchbase.
- Visualização de dados com Couchbase e Knowi - Esse é outro caso de uso para o qual os Reds estão pensando em usar os dados de leitura de tíquetes.
Deixe um comentário abaixo ou encontre-me em Twitter @mgroves. Força Reds!
Boa postagem e bom momento para o blog!
Como registrar/depurar erros na função. Basicamente, se não funcionar, onde depurar.
Para obter informações sobre registro/depuração, consulte https://docs.couchbase.com/server/6.0/eventing/eventing-debugging-and-diagnosability.html (substitua por 6.5 se estiver usando a versão beta).