.NET

Couchbase .NET SDK 2.0 Developer Preview 3

Como continuación de la anterior DP2 en junio, estamos lanzando otra vista previa para desarrolladores, DP3. Esta vista previa para desarrolladores, añade una plétora de correcciones de errores, características y lo más importante, los cambios en la API pública a través de a) proporcionar métodos para trabajar con "documentos" y b) cambiar la forma en que un objeto de clúster es instanciado. También hemos trasladado el repositorio de CouchbaseLabs a Couchbase en Github; hablaré de ello más adelante.

Documentos, documentos por todas partes

Uno de los principales cambios en esta versión preliminar para desarrolladores y una desviación del SDK .NET anterior, es la evolución de Couchbase de un almacén de Claves/Valores a una base de datos de documentos - que a su vez se refleja en la API pública. Esto significa que ahora tenemos métodos que toman y devuelven un objeto documento en lugar de un par K/V. Todas las otras bondades de Couchbase como CAS y restricciones de durabilidad y otras características se siguen proporcionando, pero ahora las envolvemos en un único objeto "documento", del que mediante la configuración de las distintas propiedades, se obtiene el comportamiento que se desea.

Para soportar el concepto de "documento", se han añadido a la interfaz de IBucket una serie de métodos basados en documentos que soportan una nueva clase Document:

 

document-classes

El resultado de una llamada utilizando uno de estos nuevos métodos de documento es un objeto DocumentResult, que es similar a los objetos OperationResult que son devueltos por los otros métodos K/V. La diferencia es que el campo Document es una referencia a Document. La diferencia es que el campo Documento es una referencia a Documento. Si desea obtener directamente el valor del documento (el valor de T), utilice el campo Valor.

Por ejemplo, así es como ahora (usando DP3) almacenarías un documento JSON en Couchbase usando el método Upsert:

 utilizando (var cubo = _cluster.OpenBucket())
{
var documento = nuevo Documento<dinámico>
{
Id = "persona1",
Valor = nuevo
{
Nombre = "Jeff", Edad = 22
}
};var resultado = cubo.Upsert(documento);
}

Si te lo estás preguntando, Upsert() es un método que inserta o actualiza un documento dependiendo de si existe o no. Otros métodos basados en documentos son:

  • Insert(): inserta un documento, a falta de que exista.
  • Replace(): reemplaza un documento existente, fallando si no existe.
  • Remove(): elimina un documento si existe.
  • GetDocument(): devuelve un documento para un id dado.

¿Significa esto que Couchbase ya no soporta las operaciones tradicionales de Memcached basadas en K/V? Por supuesto que no. La API seguirá soportando estas operaciones, sin embargo, la esperanza es que el nuevo enfoque basado en "documentos" hará más fácil para los desarrolladores utilizar la API y Couchbase en general para una gama más amplia de aplicaciones. Al menos debería hacer que la semántica de trabajar con documentos JSON sea más fácil de entender e intuitiva.

¿Singleton's? ¡No necesitamos a ningún apestoso Singleton!

En DP1 y DP2 para instanciar un objeto CouchbaseCluster, ya que era un Singleton cargado perezosamente, primero creabas un ClientConfiguration y lo pasabas al método estático Initialize() y luego llamabas a Get() en la clase CouchbaseCluster para obtener una referencia al objeto cluster. Aunque la intención era buena (asegurar que el CouchbaseCluster es un objeto global), las desventajas hacían que no fuera una elección de diseño estelar: significaba que podías tener uno y sólo un objeto CouchbaseCluster por AppDomain (¿y si tenías dos clusters de Couchbase separados que estabas usando en una sola app?) y era una forma un poco rara de empezar a usar un bucket - una experiencia de programación incómoda.

En DP3 decidimos eliminar el requisito explícito de un Singleton y en su lugar dividir la clase en una clase estándar CouchbaseCluster, sin límites en el número que podría ser instanciado y una clase ClusterHelper que es un singleton envoltorio alrededor de CouchbaseCluster en el caso de que quisieras estar seguro de que sólo una instancia sería creada. Lo mejor de ambos mundos.

A continuación se muestra un ejemplo de creación de un objeto CouchbaseCluster en DP3:

 var configuración = nuevo ClientConfiguration();
var grupo = nuevo CouchbaseCluster(configuración);

Aquí hay un ejemplo de uso de la clase ClusterHelper para asegurar que sólo un único objeto CouchbaseCluster sería creado por AppDomain:

 ClusterHelper.Inicializar();
var grupo = ClusterHelper.Visite();

¿Te estás preguntando por qué incluimos un objeto ClusterHelper? Es porque el objeto CouchbaseCluster es un objeto muy caro de crear y funciona mejor cuando se crea cuando la aplicación se inicia y se destruye cuando la aplicación termina. Tendré más sobre esto en un futuro post.

Pruébelo (y envíenos sus comentarios).

Descarga los binarios a continuación o consulta el código fuente en Github y dinos lo que piensas. Además, no olvides que esto es un pre-lanzamiento y las cosas cambiarán definitivamente antes de Beta y GA. La mayoría de los cambios serán internos, especialmente alrededor de las porciones de IO y namespaces. Dependiendo de la retroalimentación de la comunidad las interfaces públicas pueden cambiar también.

Por favor, por favor, no utilice esto en la producción Además, aunque la funcionalidad básica funciona, el código aún no ha superado un conjunto exhaustivo de pruebas situacionales, por lo que las cosas pueden fallar durante un escenario de Failover/Swap/Rebalance.

Fuente y binarios

  • Tenga en cuenta que la rama de desarrollo del SDK 2.0 es ahora la rama maestro en Github y la rama de desarrollo 1.X se llama ahora liberación13.
  • Si encuentras un error, crea un pull request y/o y NCBC.
  • Los binarios se encuentran en aquí.
Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Autor

Publicado por Jeff Morris, Ingeniero Superior de Software, Couchbase

Jeff Morris es Ingeniero de Software Senior en Couchbase. Antes de unirse a Couchbase, Jeff pasó seis años en Source Interlink como Arquitecto Web Empresarial. Jeff es responsable del desarrollo de los SDK de Couchbase y de cómo integrarse con N1QL (lenguaje de consulta).

7 Comentarios

  1. ¿Habrá versiones asíncronas de todos los métodos de la API que devuelvan una Task<documentresult?

    1. David...

      Sí, ese es el plan; actualmente estamos trabajando en la estabilización de los aspectos de configuración (escenarios de intercambio/reequilibrio/fallo), una vez hecho esto pasaremos a los métodos TAP. Al principio se realizaron algunos trabajos experimentales que aún deben integrarse.

      -Jeff

  2. ¿Habrá operaciones masivas de upsert? Es una gran laguna que esto no exista en el SDK 1.3, especialmente para un sistema que se supone que es de alto rendimiento.

    1. BTW este ejemplo ya no funciona con lo último en git.

      1. Sí, hay cambios entre DP3, Beta y la rama de desarrollo actual. Notable, CouchbaseCluster ha sido renombrado a Cluster, para hacerlo más simétrico con los otros SDK\'s.

    2. Sí, la función Get/Upsert masiva se incluirá en la versión GA, que debería publicarse en cualquier momento.

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.