Eventos

Usando o Eventing Service para consolidar dados de várias fontes

Uma das muitas vantagens de usar um banco de dados baseado em documentos, como o Couchbase, é a capacidade de usar um modelo de dados flexível para armazenar dados sem as restrições de um esquema rígido e predeterminado. Muitos clientes escolhem um banco de dados NoSQL para suportar a ingestão de dados de várias fontes. Mas e se você precisar que seus dados sejam transformados para que correspondam aos dados existentes? Talvez você precise de todos eles em um formato uniforme para fins de relatório. Seja qual for o motivo, esse é um uso perfeito para o Serviço de eventos no Couchbase.

Serviço de eventos do Couchbase

O serviço de eventos é um recurso interno do Couchbase Enterprise Edition que permite a aplicação de funções JavaScript, ou lambdasque respondem a eventos de mutação. Sempre que um documento é criado, modificado ou excluído, uma ação pode ser executada por execução de lógica comercial pura em seu JavaScript. Há várias ações que podem ser executadas, como enriquecimento de dados, chamada de fluxos de trabalho externos (por meio de chamadas à API RESTful) e eventos baseados em cronômetro (retomada da execução no futuro). Pense nos eventos como um banco de dados legado pósgatilho com esteroides.

Consolidação de dados

Neste exemplo simplificado, imagine que você acabou de adquirir duas novas fontes de dados de clientes. Esses dados podem ser provenientes de uma fonte normalizada, de um arquivo simples ou de ambos, e você deseja que esses dados correspondam aos dados de clientes existentes armazenados em um formato desnormalizado.

A primeira fonte de dados é um banco de dados normalizado (limpo e preciso) contendo clientes no Canadá. Cada registro de cliente aponta para um endereço de cobrança e um endereço de entrega, e cada endereço é normalizado para eliminar a redundância de dados de cidade e província:

Normalized datasource for eventing
A segunda fonte de dados é um arquivo simples que também contém clientes canadenses, mas que não rastreia endereços de cobrança e de envio separados. Como você pode ver, apenas um único elemento de dados de endereço é armazenado no registro do cliente:

Customer table, data model of single address data

Precisamos transformar esses dados à medida que eles chegam para que correspondam ao nosso banco de dados de clientes existente, que é desnormalizado, de modo que os endereços de cobrança e envio sejam anexados aos dados do cliente (da segunda fonte) como subdocumentos:

Creating sub-documents on denormalzied data model

Vamos começar com fácil A primeira solução é a importação de arquivos simples. O processo de transformação desses dados envolve a cópia dos dados do cliente (nome, e-mail, telefone, nome da empresa) em um novo documento. Em seguida, os dados de endereço precisam ser copiados em subdocumentos para os endereços de faturamento e de correspondência. Como temos apenas um endereço por cliente, copiaremos esse endereço para o subdocumento de endereço de faturamento e de correspondência:

Importing and transforming subdocuments
Código JavaScript para consolidar as tabelas

O código do Eventing para realizar isso é bastante simples:

O código acima deve ser fácil de entender, mesmo para programadores que não trabalham com JavaScript, mas vou dividi-lo por seção para ter certeza.

    • Linha 1 acima é chamado sempre que um documento no compartimento de origem sofre mutação (é criado ou modificado). Veremos a seguir como definimos o compartimento de origem.
    • As linhas 2 a 3 criam objetos JavaScript para manter o novo documento do cliente e o documento de endereço que serão usados como subdocumentos dentro do documento do cliente.
    • Linhas 5-15 copiar as propriedades do documento original para os objetos de cliente e endereço.
    • Linhas 18 e 19 atribuir o documento de endereço como subdocumentos do cliente para as propriedades de endereço de correspondência e de faturamento.
    • Linha 22 realmente cria o documento no bucket de destino do Couchbase. Veremos a seguir como definimos o bucket de destino.
    • Finalmente, linha 25 excluirá o documento original, embora ele esteja comentado aqui.
    • Linha 27 registra a operação. Talvez você queira comentar/remover isso após o teste.

Configurar o ambiente

Para testar esse script, precisaremos configurar nosso ambiente do Couchbase. Em primeiro lugar, precisaremos de um cluster do Couchbase que execute o serviço de dados e o serviço de eventos. Ele pode ser pequeno, como um cluster de nó único em execução no Docker, ou um cluster maior de vários nós em execução no Capella.

Quando o cluster estiver em funcionamento, precisaremos criar os buckets para importar dados e um bucket de destino final. O serviço de eventos também requer um bucket de metadados. Crie os quatro buckets a seguir, cada um com a cota mínima exigida de 100 MB:

    • esquema1
    • esquema2
    • cliente
    • eventing_merge 

Também recomendo ativar descarga para este exercício.

Criação de uma função de eventos

Agora precisamos criar a função de eventos. Selecione a função eventos e, em seguida, clique em Adicionar função. Use as seguintes configurações:

Eventing function settings in Couchbase

Em seguida, clique em Próximo: Adicionar código e substitua o padrão Sobre a atualização com o código acima. Clique em Salvar e Retorno. Neste ponto, o código foi armazenado, mas a função precisa ser implementada para que possa começar a processar os dados. Clique no nome da função para abrir suas configurações e implemente a função agora.

Criação de documentos JSON de teste

Agora, vamos testá-lo criando um documento na pasta esquema2 balde. Adicione um documento usando wile.e.coyote@acmecorp.com como a chave do documento e com o seguinte corpo de documento:

Em instantes, você verá que as estatísticas do evento indicam sucesso:

event status feedback

Agora dê uma olhada no cliente e você verá que o documento acima foi transformado. Observe como o endereço agora existe como subdocumentos dentro das propriedades endereço de cobrança e endereço de correspondência:

sampel JSON document for addresses

Transformação em subdocumentos

Agora vamos abordar a transformação mais complexa do esquema. A migração da estrutura relacional para corresponder à nossa estrutura de subdocumento é mais ou menos assim:

Migrating the relational structure to match our sub-document structure
Precisaremos desnormalizar as tabelas de endereço e código postal em um único subdocumento, um para cada endereço de remessa/correio e outro para o endereço de cobrança. Nesse caso, os dados das três tabelas são armazenados em coleções dentro do bucket. 

Código JavaScript para desnormalização

Vamos decompor esse código novamente como antes.

    • Linhas 2-4 criar objetos JavaScript para armazenar o novo documento, bem como os subdocumentos para os endereços de correspondência e de cobrança.
    • Linhas 6-10 copie as propriedades do contato para o novo documento.
    • Linhas 12 e 13 copie os dados de endereço da coleção de endereços usando a chave de documento armazenada na propriedade address_id do contato.
    • Linhas 15-19 extrai os dados da cidade e da província da coleção de províncias, usando o province_id do documento de endereço como a chave do documento.
    • Linhas 21 e 22 em seguida, anexe esses objetos de documento como subdocumentos ao novo documento de contato.
    • Finalmente, linha 26 grava o novo documento no bucket de destino.
    • Linha 29se não for comentado, excluirá o documento original do contato do bucket de origem. Observe que não queremos excluir também os documentos de endereço e província associados, pois eles podem ser usados por outros contatos.

Criação da função de eventos para desnormalização

Crie essa função de evento usando as seguintes configurações e cole o código acima para substituir o Sobre a atualização função. Quando terminar, vá em frente e implemente a função.

Setting up an eventing function in Couchbase

Para testar essa função, precisaremos criar coleções no esquema1 (use o padrão ) com os nomes: endereços, clientes, códigos postais. Em seguida, crie os seguintes documentos (nesta ordem, caso contrário, as pesquisas na função falharão):

Códigos postais com a ID do documento 43062:

Códigos postais com a ID do documento 23228:

Endereços com a ID do documento 000071:

Endereços com a ID do documento 000086:

Por fim, no clientes com a ID do documento blinded_by@science.com:

Em pouco tempo, você verá que as estatísticas dessa função são bem-sucedidas:

Function success status

E se você observar o documento no compartimento de clientes, verá a seguinte transformação com os dois endereços desnormalizados em subdocumentos.

Automatic denormalization of JSON documents using eventing

Considerações finais

Este é um exemplo muito simplista. Em um ambiente de produção, você provavelmente adicionará código para tratar exceções.  

Além disso, você pode aumentar o número de workers de 1 para o número de vCPUs se tiver um conjunto de dados grande e precisar de mais desempenho

As funções de eventos usadas neste blog podem ser encontradas no seguinte repositório do github: https://github.com/djames42/cb_eventing_merge. Nesse repositório, há também alguns scripts (um script Bash e um script Python) que podem ser usados para criar um cluster de nó único com as funções de eventos e conjuntos de dados de amostra maiores pré-carregados.

Recursos

Referências

 

Compartilhe este artigo
Receba atualizações do blog do Couchbase em sua caixa de entrada
Esse campo é obrigatório.

Autor

Postado por Daniel James, engenheiro de soluções sênior

Deixe um comentário

Pronto para começar a usar o Couchbase Capella?

Iniciar a construção

Confira nosso portal do desenvolvedor para explorar o NoSQL, procurar recursos e começar a usar os tutoriais.

Use o Capella gratuitamente

Comece a trabalhar com o Couchbase em apenas alguns cliques. O Capella DBaaS é a maneira mais fácil e rápida de começar.

Entre em contato

Deseja saber mais sobre as ofertas do Couchbase? Deixe-nos ajudar.