Em nossa série de treinamentos contínuos, várias perguntas surgem a cada vez, e eu as relaciono com suas respectivas respostas abaixo!
Couchbase 102 - Operações do SDK
Conceitos de operações por idioma: https://github.com/couchbaselabs/DeveloperDay
P: Essas operações são as mesmas para aplicativos móveis?
R: Não, eles não são os mesmos. O Couchbase Lite tem sua própria API. Você pode ver a documentação da API do Couchbase Lite Beta 2 para iOS aqui: http://couchbase.github.io/couchbase-lite-ios/docs/html/annotated.html
P: O Couchbase pode garantir que todas as operações sejam persistidas? Ou seja, quando um put para o Couchbase retorna, o valor é considerado persistido mesmo que o Couchbase O servidor tem uma falha grave enquanto os dados ainda estão na fila de disco e na fila de replicação. Que mecanismo é usado para garantir isso?
R: Não, não podemos dar essa garantia. É possível que o cliente veja uma operação bem-sucedida, mas o servidor sofra uma falha grave antes de ser replicado ou persistido. Em caso de falhas graves, nenhum sistema é seguro. O que tentamos minimizar é a quantidade de perda de dados, além de manter o alto desempenho. Com a replicação e o failover, podemos conseguir isso e ser capazes de promover réplicas rapidamente e manter o cluster e o aplicativo em funcionamento durante falhas de nós. Oferecemos observações de durabilidade para operações de armazenamento com base em cada operação de documento; você só receberá uma chamada de retorno se o documento tiver sido replicado, persistido ou ambos. Essas observações aumentam a latência das operações, portanto, é melhor usá-las quando necessário, e não em todas as operações.
P: Tenho certeza de que o uso do Storage com o Observe introduzirá uma grande sobrecarga... O Jasdeep pode fornecer algum número (proporção com e sem)?
R: Não há como fornecer um valor exato aqui, pois ele varia de acordo com o hardware e a escala horizontal. O que posso dizer é que é significativo o suficiente para pensar duas vezes antes de fazer isso para cada operação de armazenamento, especialmente se você tiver um alto volume de gravação.
P: O que acontece quando você tem um novo par K-V (mesma chave, mas valores diferentes) que está sendo inserido simultaneamente e exatamente ao mesmo tempo em dois data centers? Nesse caso, como isso está sendo gravado no cache (ou seja, a fila do XDCR ainda está atrasada), não é possível ser realmente "consistente", certo? Como esse conflito é tratado?
R: Somente a consistência se aplica dentro de um cluster, o XDCR, por definição, é eventualmente consistente porque os dados precisam ser movidos entre clusters através do cabo. Para responder à sua pergunta, eu abordo as regras de resolução de conflitos do XDCR no webinar de treinamento do Couchbase 105, nossa lógica de resolução de conflitos é bastante simples nesse ponto. A lógica de resolução de conflitos é notoriamente difícil de ser escrita universalmente. No seu cenário, como ambos são documentos novos, têm apenas uma criação cada e foram gravados em dois clusters ao mesmo tempo com o XDCR bidirecional, um "vencedor" será escolhido "aleatoriamente". Nossas regras de resolução de conflitos estão relacionadas ao número de revisões que um documento tem, além de outros critérios.
P: É possível bloquear documentos entre clusters com o XDCR?
R: Não, o bloqueio de documentos é local apenas para um cluster do Couchbase, não entre clusters.
P: Se eu quiser modificar/atualizar alguns itens em um documento, como posso escrever um código em Java (ou em qualquer outra linguagem) para conseguir isso em vez de localizar e atualizar manualmente um determinado item/campo?
R: Na verdade, esse é um uso bastante padrão. Se estiver usando Java, você transcodificará/desmembrará o JSON para seu objeto, modificará quaisquer valores e transcodificará/desmembrará de volta para o JSON para uma operação de substituição. Não temos API para atualizações parciais em documentos do lado do servidor do Couchbase, entre os clientes e o servidor do Couchbase, sempre transmitimos o documento inteiro para frente e para trás. Isso significa que não podemos enviar modificações parciais de JSON para o servidor Couchbase e fazer com que o servidor obtenha o documento e atualize as alterações parciais.
P: Duas versões diferentes (por exemplo, v2.0.1 e v2.2) do Couchbase podem coexistir na mesma caixa?
R: Você pode instalar os dois, mas executá-los em um cluster é possível, mas é complicado e, definitivamente, o uso não é padrão. Você teria que alterar todos os mapeamentos de porta e as expectativas de onde o segundo servidor está para poder agrupá-los. Em geral, eu diria que não vale a pena o esforço. Se você estiver familiarizado com o Docker, é possível criar um cluster no Docker com o core.os.
P: As operações de inserção/atualização criam um bloqueio em toda a coleção ou no documento? O Couchbase permitirá operações de leitura na coleção/documento?
R: Não bloqueamos por padrão. Documentos individuais podem ser bloqueados para gravações por meio da operação GetWithLock com um tempo limite automático máximo de 30 segundos. Não existe o conceito de "coleção", nem bloqueios de coleção, nem bloqueios de balde (banco de dados). O uso de operações CAS para concorrência otimista geralmente é uma prática muito melhor do que o bloqueio. O bloqueio só é realmente necessário em casos de uso específicos em que o CAS pode não ser suficiente ou para realmente impedir qualquer modificação por um determinado período de tempo. Não precisamos de bloqueio para leitura/gravação.
P: Você tem algo como o gridFS que o Mongodb tem para arquivos de imagem/vídeo?
R: Não dividimos documentos em partes separadas, não. No entanto, você pode fazer isso em seu aplicativo se o seu caso de uso assim o exigir.
P: Existe um recurso de upload em massa de documentos JSON no servidor couchbase? Queremos replicar as alterações de nossos sistemas corporativos (armazenamentos de dados) no Couchbase.
R: Alguns de nossos SDKs têm multi-set, mas, em geral, as pessoas fazem isso por script. Fazer operações é fazer operações de qualquer maneira. Em geral, eu recomendaria encontrar uma maneira de paralelizá-las e usar as VMs ou linguagens de codificação mais rápidas (Java/C) em vez de linguagens de script. A ferramenta de linha de comando cbtransfer pode fazer parte do que você está pedindo, dependendo da fonte do JSON; se forem arquivos, por exemplo, a ferramenta basicamente usa a biblioteca c.
Q: O que são pools em "http://127.0.0.1:8091/pools" quando você especifica isso no código java?
R: É apenas parte do URI de conexão. Em Java, temos essa sintaxe há muito tempo, em vez de apenas IP:Porta. Esse foi um dos nossos primeiros clientes do SDK. Permitimos a "ideia" de vários pools, mas na verdade há apenas um. Os outros SDKs usam apenas a sintaxe IP:Port e acrescentam a parte pools/default/{bucket} do próprio URI, o que o Java também está fazendo.
P: Você pode explicar melhor como o CAS funciona? We se houver incompatibilidade de valores de CAS?
R: Toda vez que você armazena um documento ou modifica um documento (alteração da expiração), é gerado um novo valor inteiro longo associado ao documento (nos metadados). Esse valor representa seu estado atual, semelhante à verificação CRC ou hash MD5. Se você fizer uma operação de substituição e fornecer o valor CAS que recuperou pela última vez para um documento, se ele corresponder, a operação continuará. Se não corresponder, você receberá um erro de incompatibilidade de CAS, o que significa que o documento foi modificado e agora tem um CAS diferente. Então, você pode lidar com essa condição de corrida. Isso é chamado de simultaneidade otimista porque nenhum recurso do servidor é necessário para lidar com isso, ou seja, nenhum bloqueio é necessário.
P: O que acontece se eu criar um conjunto com o parâmetro de durabilidade > da réplica presente no cluster?
R: Você pode ter um erro :).
P: Qual é o limite máximo do tamanho do documento como um todo? Qual é o limite máximo de armazenamento de dados como Value quando salvamos dados binários?
R: Em ambos os casos, são 20 MB. De qualquer forma, você não deseja armazenar arquivos maiores do que isso no Couchbase. Existem soluções baseadas em CDN muito mais inteligentes para armazenar e distribuir arquivos grandes (que provavelmente são vídeos). Nesses casos, você armazenaria os metadados do arquivo no Couchbase como JSON com um link para o arquivo, e o arquivo real na CDN. Você também pode conferir o CBFS, um armazenamento de arquivos distribuído redundante semelhante ao S3 de código aberto que usa o Couchbase, escrito por um de nossos fundadores: https://github.com/couchbaselabs/cbfs
P: Você está sempre dizendo que é bom configurar o servidor de modo que todos os documentos caibam na RAM. Qual seria o nível de degradação do desempenho se eu usasse um disco SSD e pouca memória RAM?
R: Isso depende. Se você tiver um alto volume de gravação e tiver preenchido a cota de RAM do seu balde, terá processos concorrentes que estão tentando obter documentos no disco: ejeção de documentos ativos da RAM para liberar espaço na RAM e gravação de novos documentos no disco. Se você puder ter E/S de disco suficiente por meio de SSD Raid para que possa exceder o volume de gravação em termos de ejeção de documentos ativos mais rapidamente do que está preenchendo a RAM, então sim. Se você escalar horizontalmente, terá mais chances, pois terá muitos nós ejetando ao mesmo tempo e, teoricamente, poderá superar o volume de gravação! Caso contrário, você receberá erros de OOM temporário no cliente, o que lhe dirá para "recuar" nas operações e tentar novamente.
P: Como salvamos dados binários (arquivos como imagens, PDF, etc.)?
R: Veja a próxima pergunta abaixo... :)
P: O que acontece quando estamos armazenando imagens no Couchbase?
R: Você pode armazenar imagens de duas maneiras diferentes com o Couchbase: uma é armazenar dados binários diretos como um valor de documento. A segunda opção é armazená-las como bases64 pré-codificadas em um documento JSON, ou seja, é um documento JSON padrão com uma ou mais imagens codificadas como valores JSON (com chaves JSON). A vantagem de armazenamento de imagens no Couchbase é que ele será servido a partir da RAM em vez do disco, portanto, terá um ótimo desempenho. Junte isso ao XDCR (Cross Data Center Replication) e você poderá criar sua própria CDN para imagens!
P: Como modificar/atualizar vários documentos e reverter se ocorrer um erro em um deles?
R: No Couchbase, você pode usar facilmente a simultaneidade otimista (CAS) ou pessimista (Lock) para transações em único documentos, mas para vários documentos em uma única "transação", será necessário usar o que é chamado de Two-Phase Commit. Você pode ler mais sobre isso aqui: http://www.couchbase.com/docs/couchbase-devguide-2.0/two-phase-commits.html
P: Existe a possibilidade de transações no Couchbase?
R: Como na pergunta anterior, você pode facilmente fazer transações de documento único usando a concorrência otimista com (CAS - Compare and Swap) ou Get and Lock.
P: Existe uma operação de inserção/atualização em lote que poderia chamar de volta uma lista de inserções/atualizações com falha após a gravação no disco primário?
R: Em alguns SDKs (Python, por exemplo), eles têm operações de tipo com vários conjuntos (todos eles têm operações com vários get), mas não acredito que suportemos operações de tipo com vários conjuntos E observação.
P: Como posso fazer uma consulta com vários parâmetros para passar, como nome, data e status? algo como um "where" no SQL?
R: Isso é feito com nossas visualizações (índices). A consulta de vários parâmetros pode exigir: a) a consulta de visualizações separadas e a realização de uma interseção dentro do aplicativo ou a criatividade com a chave do índice para que você possa fazer a consulta por intervalo. Há várias estratégias diferentes para isso, e a resposta será dada de forma sucinta, dependendo do caso de uso e do design do documento.
P: Vocês oferecem suporte a outras linguagens, como Go ou Clojure?
R: Sim! Temos edições comunitárias para Go (https://github.com/dustin/go-couchbase), você pode ver todos os clientes da comunidade em nossa página Todos os clientes em couchbsae.com: http://www.couchbase.com/communities/all-client-libraries As bibliotecas de clientes da comunidade não são oficialmente suportadas por nossos contratos de suporte, mas você pode encontrar facilmente ajuda de nossos engenheiros via IRC ou Twitter.
P: Os padrões-chave são mais rápidos do que as visualizações?
R: Na maioria dos casos em que você pode realmente usar os padrões de chave, sim, porque são operações de soquete binário com dados que saem do cache da RAM. Como os dados são distribuídos e a indexação ocorre em cada nó do cluster responsável pela distribuição dos dados, As visualizações exigem a dispersão da consulta em todos os nós do cluster e a coleta de resultados de todos os nós do cluster. Isso sempre será mais lento do que ir diretamente a um único nó do Couchbase e fazer uma operação CRUD binária em uma conexão de soquete binário persistente para uma única chave. Portanto, sim, os padrões de chave são mais rápidos do que as visualizações. Entretanto, nem todos os problemas podem ser resolvidos pelos padrões-chave, por isso existem as visualizações. O caso de uso típico das visualizações é consultar a visualização e, em seguida (quando necessário), realizar uma operação de obtenção múltipla de documentos em um conjunto de resultados da visualização. Nos casos de uso que exigem consultas mais complexas, as visualizações são a próxima resposta, e para os casos de uso que exigem uma busca mais flexível, nossa integração com o Elastic Search é a resposta. Estamos trabalhando em uma linguagem de consulta do Couchbase (N1QL) para consultas AdHoc do Couchbase, ele está atualmente no Developer Preview, que também é outra opção interessante e avançada para consultas.