O Couchbase Functions está sendo apresentado na versão 5.5 do Couchbase Server sob o código Serviço de eventos do Couchbase. O Couchbase Functions permite que você aproxime a lógica de negócios orientada por dados dos seus dados. A lógica de negócios definida pelo usuário pode ser acionada em tempo real no servidor quando os dados são alterados como resultado das interações que ocorrem nos aplicativos da Web e de borda. Quando a computação reside mais perto dos dados, é importante entender como a computação se comporta quando os dados, que ela está ouvindo, mudam. Tentaremos entender como o Eventing Service reage à ordenação das mutações.
Vamos começar e entender o comportamento com um exemplo simples. Vamos criar uma função de teste com o seguinte código e assumir as configurações padrão (ou seja, 3 trabalhadores) para a função.
1 2 3 4 5 6 7 8 9 |
função Sobre a atualização(doc, meta) { registro('ID do documento criado:', meta.id); } função OnDelete(meta) { registro('ID do documento excluído:', meta.id); } |
Observação: Escolha "Tudo" no limite de alimentação em todas as operações abaixo durante a implementação da função.
No Bucket de origem que essa função escuta, vamos inserir cerca de 10 documentos com IDs de documento numéricos crescentes. No arquivo de log do aplicativo para essa função, você verá algo semelhante às seguintes entradas.
1 2 3 4 5 6 7 8 9 10 |
2018-05-13T11:36:05.163-04:00 [INFORMAÇÕES] "ID do documento criado:" "2" 2018-05-13T11:36:05.163-04:00 [INFORMAÇÕES] "ID do documento criado:" "3" 2018-05-13T11:36:05.163-04:00 [INFORMAÇÕES] "ID do documento criado:" "9" 2018-05-13T11:36:05.163-04:00 [INFORMAÇÕES] "ID do documento criado:" "8" 2018-05-13T11:36:05.164-04:00 [INFORMAÇÕES] "ID do documento criado:" "1" 2018-05-13T11:36:05.164-04:00 [INFORMAÇÕES] "ID do documento criado:" "0" 2018-05-13T11:36:05.165-04:00 [INFORMAÇÕES] "ID do documento criado:" "5" 2018-05-13T11:36:05.165-04:00 [INFORMAÇÕES] "ID do documento criado:" "4" 2018-05-13T11:36:05.165-04:00 [INFORMAÇÕES] "ID do documento criado:" "7" 2018-05-13T11:36:05.165-04:00 [INFORMAÇÕES] "ID do documento criado:" "6" |
TTente cancelar a implantação e implantar a função acima e observe que a ordem dos IDs(/alterações) não é a mesma. Você pode repetir essa etapa algumas vezes para reforçar essa observação.
1 2 3 4 5 6 7 8 9 10 |
2018-05-13T11:59:17.504-04:00 [INFORMAÇÕES] "ID do documento criado:" "8" 2018-05-13T11:59:17.504-04:00 [INFORMAÇÕES] "ID do documento criado:" "9" 2018-05-13T11:59:17.504-04:00 [INFORMAÇÕES] "ID do documento criado:" "3" 2018-05-13T11:59:17.504-04:00 [INFORMAÇÕES] "ID do documento criado:" "2" 2018-05-13T11:59:17.505-04:00 [INFORMAÇÕES] "ID do documento criado:" "1" 2018-05-13T11:59:17.505-04:00 [INFORMAÇÕES] "ID do documento criado:" "0" 2018-05-13T11:59:17.507-04:00 [INFORMAÇÕES] "ID do documento criado:" "4" 2018-05-13T11:59:17.507-04:00 [INFORMAÇÕES] "ID do documento criado:" "7" 2018-05-13T11:59:17.507-04:00 [INFORMAÇÕES] "ID do documento criado:" "6" 2018-05-13T11:59:17.507-04:00 [INFORMAÇÕES] "ID do documento criado:" "5" |
Take-Away#1 : A função não processa os documentos na ordem em que foram inseridos.
Agora, vamos excluir um dos documentos que foi inserido (em nosso exemplo, excluí o DocId#2). Observamos imediatamente a seguinte entrada no registro (que está correta):
1 |
2018-05-13T11:43:10.165-04:00 [INFORMAÇÕES] "ID do documento excluído:" "2" |
Agora, vamos cancelar a implementação da função e implementá-la novamente. Observamos a seguinte ordem:
1 2 3 4 5 6 7 8 9 10 |
2018-05-13T11:44:04.808-04:00 [INFORMAÇÕES] "ID do documento criado:" "8" 2018-05-13T11:44:04.808-04:00 [INFORMAÇÕES] "ID do documento excluído:" "2" 2018-05-13T11:44:04.809-04:00 [INFORMAÇÕES] "ID do documento criado:" "1" 2018-05-13T11:44:04.809-04:00 [INFORMAÇÕES] "ID do documento criado:" "0" 2018-05-13T11:44:04.809-04:00 [INFORMAÇÕES] "ID do documento criado:" "3" 2018-05-13T11:44:04.809-04:00 [INFORMAÇÕES] "ID do documento criado:" "9" 2018-05-13T11:44:04.810-04:00 [INFORMAÇÕES] "ID do documento criado:" "4" 2018-05-13T11:44:04.810-04:00 [INFORMAÇÕES] "ID do documento criado:" "7" 2018-05-13T11:44:04.810-04:00 [INFORMAÇÕES] "ID do documento criado:" "6" 2018-05-13T11:44:04.810-04:00 [INFORMAÇÕES] "ID do documento criado:" "5" |
Observamos isso:
- "Created Doc ID:" "2" está faltando
- "Deleted Doc ID:" "2" aparece antes na ordem de processamento e não depois.
Take-Away#2 : Desduplicação
Operações sucessivas (/alterações/mutações) em um documento são agrupadas (dedup'ed), quando ocorrem em rápida sucessão, pelo Couchbase Server, de modo que a sobrecarga no disco e na memória seja minimizada. O Couchbase Server envia somente a versão mais recente de um documento no fluxo DCP.
No exemplo acima, esse é o motivo pelo qual o manipulador OnUpdate não é acionado, pois a exclusão do DocID foi a mais recente na sequência de operações no documento; ou seja, quando UPDATE e DELETE acontecem em ordem, eles são agrupados para DELETE, que acontece mais tarde na linha do tempo. Ou seja, quando várias atualizações (ou até mesmo uma única atualização) em um documento são seguidas pela exclusão do documento, apenas o evento Delete é visto pelo Couchbase Functions, pois as atualizações são agrupadas no evento final, que é a exclusão do documento.
Um comportamento semelhante será observado se um documento passar por várias atualizações em uma pequena janela e, em seguida, uma função consumir as alterações; somente a última alteração ocorrida no documento será vista e as alterações intermediárias serão perdidas. Esse é o caso apenas quando uma nova função é implantada em um bucket existente com muitas alterações ocorrendo em um bucket.
Se a função for implantada e ocorrerem alterações em um documento, cada alteração será tratada pela função. Porém, se o número de alterações ocorridas em um documento for muito alto em um pequeno intervalo de tempo, o Couchbase Server ainda fará uma certa quantidade de desduplicação, e isso pode fazer com que nem todas as alterações acionem a função.
Ou seja, se 10 documentos foram inseridos e um deles foi excluído, então, quando uma função é implementada, não é garantido que a operação de exclusão (no documento inserido e depois no excluído) será vista no final pela função.
Take-Away#3 : A função não processa as mutações na ordem em que foram feitas.
Então, o que está acontecendo aqui? Em Parte 2 Nesta série do blog, vamos nos aprofundar nos bastidores do Eventing Service do Couchbase e entender como os Eventing Workers processam as mutações.