Como continuação do DP2 anterior, em junho, estamos lançando outra prévia para desenvolvedores, o DP3. Essa visualização para desenvolvedores adiciona uma infinidade de correções de bugs, recursos e, o mais importante, alterações na API pública por meio de a) fornecimento de métodos para trabalhar com "documentos" e b) alteração da maneira como um objeto de cluster é instanciado. Também movemos o repositório de CouchbaseLabs para Couchbase no Github; falarei sobre isso um pouco mais tarde.

Documentos, documentos em todos os lugares!

Uma das principais mudanças nessa prévia para desenvolvedores e uma diferença em relação ao SDK .NET anterior é a evolução do Couchbase de um armazenamento de chave/valor para um banco de dados de documentos, o que, por sua vez, se reflete nas APIs públicas. Isso significa que agora temos métodos que recebem e retornam um objeto de documento em vez de um par K/V. Todas as outras vantagens do Couchbase, como CAS, restrições de durabilidade e outros recursos, ainda são oferecidas, mas agora as agrupamos em um único objeto "documento", a partir do qual, ao configurar as várias propriedades, você obtém o comportamento que deseja.

Para dar suporte ao conceito de "documento", uma série de métodos baseados em documentos foi adicionada à interface do IBucket que dá suporte a uma nova classe Document:

 

document-classes

O resultado de uma chamada usando um desses novos métodos de documento é um objeto DocumentResult, que é semelhante ao objeto OperationResult retornado pelos outros métodos K/V. A diferença é que o campo Document é uma referência a um documento. Se você quiser obter diretamente o valor do documento (o valor de T), use o campo Value.

Por exemplo, veja como você poderia agora (usando o DP3) armazenar um documento JSON no Couchbase usando o método Upsert:

 usando (var bucket = _cluster.OpenBucket())
{
var document = novo Documento<dinâmico>
{
Id = "person1",
Valor = novo
{
Nome = "Jeff", Idade = 22
}
};var result = balde.Upsert(documento);
}

Se você estiver se perguntando, Upsert() é um método que insere ou atualiza um documento, dependendo se ele existe ou não. Outros métodos baseados em documentos incluem:

  • Insert(): insere um documento, caso ele não exista.
  • Replace(): substitui um documento existente, falhando se ele não existir.
  • Remove(): remove um documento se ele existir.
  • GetDocument(): retorna um documento para um determinado id.

Isso significa que o Couchbase não está mais oferecendo suporte às operações tradicionais do Memcached baseadas em K/V? Absolutamente não! As APIs ainda oferecerão suporte a essas operações; no entanto, a esperança é que a nova abordagem baseada em "documentos" facilite o uso das APIs e do Couchbase em geral para uma variedade maior de aplicativos. No mínimo, ela deve tornar a semântica do trabalho com documentos JSON mais simples de entender e mais intuitiva.

Singleton's? Não precisamos de Singleton's fedorentos!

No DP1 e no DP2, para instanciar um objeto CouchbaseCluster, já que ele era um Singleton de carregamento lento, você primeiro criava uma ClientConfiguration e a passava para o método estático Initialize() e, em seguida, chamava Get() na classe CouchbaseCluster para obter uma referência ao objeto do cluster. Embora a intenção fosse boa (garantir que o CouchbaseCluster fosse um objeto global), as desvantagens tornaram essa escolha de design menos do que estelar: isso significava que você poderia ter um e somente um objeto CouchbaseCluster por AppDomain (e se você tivesse dois clusters separados do Couchbase que estivesse usando em um único aplicativo?

No DP3, decidimos acabar com o requisito explícito de um Singleton e, em vez disso, dividimos a classe em uma classe CouchbaseCluster padrão, sem limites para o número que poderia ser instanciado, e uma classe ClusterHelper, que é um singleton de wrapper em torno do CouchbaseCluster, caso você queira ter certeza de que apenas uma instância será criada. O melhor dos dois mundos.

Aqui está um exemplo de criação de um objeto CouchbaseCluster no DP3:

 var configuração = novo Configuração de cliente();
var cluster = novo CouchbaseCluster(configuração);

Aqui está um exemplo de uso da classe ClusterHelper para garantir que apenas um único objeto CouchbaseCluster seja criado por AppDomain:

 Ajudante de cluster.Inicializar();
var cluster = Ajudante de cluster.Obter();

Se estiver se perguntando por que incluímos um objeto ClusterHelper? É porque o objeto CouchbaseCluster é um objeto muito caro para criar e funciona melhor quando é criado quando o aplicativo é iniciado e é destruído quando o aplicativo é encerrado. Falarei mais sobre isso em um post futuro!

Experimente (e forneça feedback)!

Baixe os binários abaixo ou confira o código-fonte no Github e diga-nos o que achou. Além disso, não se esqueça de que este é um pré-lançamento e as coisas definitivamente mudarão antes do Beta e do GA. A maioria das alterações será interna, especialmente em relação às partes de IO e namespaces. Dependendo do feedback da comunidade, as interfaces públicas também poderão ser alteradas.

Por favor, não use isso na produção Além disso, embora a funcionalidade básica funcione, o código ainda não passou por um conjunto exaustivo de testes situacionais, de modo que as coisas podem falhar durante um cenário de Failover/Swap/Rebalance.

Fonte e binários

  • Observe que a ramificação de desenvolvimento do SDK 2.0 agora é a mestre no Github e o ramo de desenvolvimento 1.X agora é chamado de liberação13.
  • Se você encontrar um bug, crie uma solicitação pull e/ou e NCBC.
  • Os binários podem ser encontrados aqui.

Autor

Postado por Jeff Morris, engenheiro de software sênior, Couchbase

Jeff Morris é engenheiro de software sênior da Couchbase. Antes de ingressar na Couchbase, Jeff passou seis anos na Source Interlink como arquiteto da Web corporativa. Jeff é responsável pelo desenvolvimento dos SDKs do Couchbase e pela integração com o N1QL (linguagem de consulta).

7 Comentários

  1. Haverá versões assíncronas de todos os métodos da API que retornam uma Task<documentresult>?

    1. David -

      Sim, esse é o plano; no momento, estamos trabalhando para estabilizar os cenários dos aspectos de configuração (troca/rebalanceamento/falha) e, quando isso for feito, passaremos para os métodos TAP. Houve alguns trabalhos experimentais que foram feitos no início e que ainda precisam ser integrados.

      -Jeff

  2. Haverá operações de upsert em massa? É uma grande lacuna o fato de isso não existir no SDK 1.3, especialmente para um sistema que deveria ser de alto desempenho.

    1. Aliás, esse exemplo não funciona mais com a versão mais recente do git.

      1. Sim, há alterações entre o DP3, Beta e o ramo de desenvolvimento atual. O CouchbaseCluster foi renomeado para Cluster, para ficar mais simétrico em relação aos outros SDKs.

    2. Sim, o Get/Upsert em massa será incluído no GA, que deve ser lançado a qualquer momento.

  3. [...] nova API de documento para realizar operações CRUD em JSON [...]

Deixar uma resposta