Agora, isso não é o fim. Não é nem mesmo o começo do fim. Mas, talvez, seja o fim do começo. - Winston Churchill
A atualização de dados geralmente não é o fim, mas sim o progresso de um fluxo de trabalho. O envio segue o pedido; a atualização do estoque segue o envio; o ajuste do crédito segue a devolução; a próxima etapa do processo deve agir para manter o fluxo de trabalho em andamento. Os fluxos de trabalho podem ser simples, com poucas etapas, ou complexos, com centenas de etapas. Gerenciamento de processos de negócios (BPM) é um setor por si só.
Apresentação do Couchbase 5.5 Serviço noturno. Os desenvolvedores podem escrever uma função Javascript para ser executada após uma alteração nos dados. Referimo-nos a inserções, atualizações, mesclagens e exclusões como mutações. Vários casos de uso específicos foram documentados para o desenvolvimento desses eventos funções.
JSON modelo de dados no Couchbase veio de JavaScript. N1QL é SQL para JSON. As funções de eventos são escritas em Javascript e têm N1QL integrado. Usando as funções de eventos, é fácil escrever lógica comercial processual com acesso instantâneo aos dados.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// Função de contagem simples // Após cada atualização da amostra de viagem, mantenha o controle do número total de documentos de cada tipo. função Sobre a atualização(doc, meta) { tentar { // Emita a instrução SELECT para obter as contagens. var ginfo = SELECIONAR tipo, CONTAGEM(tipo) contagem de tipos DE `amostra de viagem` ONDE `tipo` IS NÃO FALTANDO GRUPO BY tipo; // loop pelo conjunto de resultados para (var val de ginfo) { var ckey = "trcount" + val.tipo; // Criar a string-chave do documento. var vtype = val.tipo; var vtc = val.contagem de tipos; // obter o tipo, contagem // fazer a atualização. ATUALIZAÇÃO T1 USO CHAVES[$ckey] CONJUNTO tipo = $vtype, contagem de tipos =$vtc; } } captura(e) { registro(e); } } |
Este é o ciclo de vida das funções do ponto de vista do desenvolvedor. Para cada mutação, você pode definir qualquer número dessas funções a serem executadas. É responsabilidade do desenvolvedor dimensionar os tempos de execução das funções, dependendo do número de mutações.
Este é o ciclo de vida das funções Eventing:
Para cada inserção, atualização ou exclusão (direta ou de expiração), você pode executar uma ou mais funções javascript. Essas funções podem ler os novos dados e o tipo de ação e, em seguida, executar a ação subsequente. Essa funcionalidade está bem descrita nos blogs e artigos do Couchbase.
| Tipo de declaração | Função de evento invocada |
| SELECIONAR | Nenhum |
| INSERIR | OnUpdate(). A função é chamada uma vez por documento inserido. A inserção simples insere um único documento. As inserções podem ter vários documentos usando vários documentos na cláusula VALUES ou podem inserir vários documentos por meio da instrução INSERT INTO...SELECT. |
| ATUALIZAÇÃO | OnUpdate() é chamado uma vez por documento atualizado, exceto quando várias atualizações no mesmo documento forem deduzidas em uma única atualização. O comando Update pode atualizar vários documentos. |
| UPSERT | OnUpdate(). O comportamento é semelhante ao do INSERT. |
| DELETE | OnDelete(). Invocado uma vez por documento excluído. |
| MERGE | OnUpdate() e/ou OnDelete(), dependendo das ações de inserção, atualização e exclusão. |
| CRIAR ÍNDICE, ELIMINAR ÍNDICE, EXPLICAR, PREPARAR, CONCEDER, REVOGAR | Nenhuma função de evento é invocada. |
| EXECUTAR | Depende do tipo de declaração executada. |
Essas funções também podem executar instruções N1QL. O restante do artigo aborda todos os aspectos do N1QL executados em Eventing Functions.
Declarações N1QL em funções Eventing.
| Declaração | Casos de uso para instruções N1QL em Eventing Functions |
| CRIAR ÍNDICE | Como o esquema é flexível, você poderia inspecionar os dados com frequência/periodicamente para detectar novos campos e, em seguida, criar índices sobre eles. |
| DELETE | Exclusões em cascata. |
| DROP INDEX | Um corolário do caso de uso CREATE INDEX. |
| INFER | Introspecção periódica do bucket para a estrutura. Em seguida, tomar medidas (validar, criar índice, atualizar o modelo de dados), se necessário. |
| INSERIR | Manutenção de dados referenciais (eventualmente).
Atualização de outros documentos com referências a esses dados. Por exemplo, dados de um novo CEP, estado etc. Cópia de dados (total ou parcialmente) para documentos secundários/terciários. Semelhante à ação pós-disparo. |
| MERGE | Mantenha os dados secundários em sincronia. |
| SELECIONAR | Obter dados, executar relatórios periodicamente, etc.
Verifique vários aspectos, como qualidade e validade dos dados, Quando você souber a chave do documento de destino, use as referências diretas a documentos incorporadas. Veja exemplos em: https://docs.couchbase.com/server/5.5/eventing/eventing-examples.html |
| UPSERT | Manter os dados secundários/terciários em sincronia.
Semelhante à ação pós-disparo. |
| ATUALIZAÇÃO | Manter os dados secundários/terciários em sincronia.
Semelhante à ação pós-disparo. |
Exemplos: Vamos experimentar algumas funções de eventos com o N1QL.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
selecionar meta().id, * de executar S1; [ { "S1": { "name" (nome): "Joe Smith", "zip": "94501" }, "id": "Joe::94040" }, { "S1": { "name" (nome): "John Smith", "zip": "94040" }, "id": "John::94040" } ] selecionar meta().id, * de S2; [ { "S2": { "name" (nome): "Joe Smith", "zip": "94501" }, "id": "Joe::94040" }, { "S2": { "name" (nome): "John Smith", "zip": "94040" }, "id": "John::94040" } ] selecionar meta().id, * de T1; <Não dados> |
- N1QL simples em funções para registro em log e exclusão em cascata.
Salve todos os documentos excluídos em um compartimento separado.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
função Sobre a atualização(doc, meta) { } função OnDelete(meta) { tentar { var myid = meta.id; //Inserir no balde de INSERIR PARA T1 VALORES(UUID(), {"tipo" : "excluído", "docid":$myid}); //Exclusão em cascata DELETE DE S2 USO CHAVES [$myid]; } captura(e) { registro(e); } } Depois de criando o função acima, o aplicativo Corridas o seguintes: DELETE DE S1 ONDE zíper = "94040"; // Um documento foi excluído. SELECIONAR meta().id, * de S1; // um documento acabou de ser excluído. Deve haver apenas um documento restante. [ { "S1": { "name" (nome): "Joe Smith", "zip": "94501" }, "id": "Joe::94040" } ] SELECIONAR meta().id, * de T1; // Devemos ver um registro da exclusão [ { "T1": { "docid": "John::94040", "tipo": "excluído" }, "id": "2dc9b33d-3cd4-422e-af9c-b0c664c4660f" } ] SELECIONAR meta().id, * DE S2; // Devemos ver apenas um documento devido ao efeito de exclusão em cascata da função [ { "S2": { "name" (nome): "Joe Smith", "zip": "94501" }, "id": "Joe::94040" } ] |
- função OnUpdate() para manter as informações agregadas prontas periodicamente.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
função Sobre a atualização(doc, meta) { tentar { var tempo de espera = SELECIONAR última atualização DE T1 USO CHAVES ["trstattime"]; para (var t de tempo de espera) { var lt = t.última atualização; var d = novo Data(); var n = d.getTime(); // A cada 10 minutos ou mais se ((n - lt) > (1000 * 60 * 10)) { ATUALIZAÇÃO T1 USO CHAVES["trstattime"] CONJUNTO última atualização = NOW_MILLIS() ; var ginfo = SELECIONAR tipo, contagem(tipo) contagem de tipos DE `amostra de viagem` ONDE `tipo` IS NÃO FALTANDO GRUPO BY tipo; para (var val de ginfo) { var ckey = "trcount::" + val.tipo; var vtype = val.tipo; var vtc = val.contagem de tipos; ATUALIZAÇÃO T1 USO CHAVES[$ckey] CONJUNTO tipo = $vtype, contagem de tipos = $vtc; } } } } captura(e) { registro(e); } } |
Referências:
- Documentação do Couchbase: https://docs.couchbase.com/server/5.5/eventing/eventing-overview.html
- Blogs do Couchbase sobre eventos: https://www.couchbase.com/blog/tag/eventing/
