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:
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:
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:
Aqui está um exemplo de uso da classe ClusterHelper para garantir que apenas um único objeto CouchbaseCluster seja criado por AppDomain:
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.
Haverá versões assíncronas de todos os métodos da API que retornam uma Task<documentresult>?
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
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.
Aliás, esse exemplo não funciona mais com a versão mais recente do git.
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.
Sim, o Get/Upsert em massa será incluído no GA, que deve ser lançado a qualquer momento.
[...] nova API de documento para realizar operações CRUD em JSON [...]