Estoy muy emocionado de finalmente escribir este anuncio, ya que me permite poner el foco en algo que hemos estado trabajando duro durante los últimos meses. En un esfuerzo colectivo de todo el equipo de SDK, hemos empezado a desplegar SDK completamente nuevos que son más rápidos, tienen API más sencillas, están preparados para el futuro para las próximas características del servidor y facilitan la integración con los ecosistemas de frameworks.
Además de mejorar el SDK de Java, también estamos lanzando un nuevo SDK de Scala¡! Proporciona soporte de primera clase para todos los que desarrollan en Scala y hace que la integración en el ecosistema Scala sea mucho más fácil en el futuro.
Como todo esto es bastante nuevo, aquí hay dragones. Apreciamos todos los comentarios e informes de errores para hacer de este el mejor SDK que hemos entregado.
Destacados
Este artículo agrupa los aspectos más destacados en dos secciones. En una se analiza la API renovada (en todos los SDK) y en la otra las mejoras específicas del SDK de Java.
Mejoras en la API cross-SDK
En un esfuerzo por mejorar la usabilidad de las APIs, las hemos recortado y refactorizado bastante. El resultado es una estructura de API muy cohesionada y regular que debería facilitar mucho su uso tanto a los recién llegados como a los usuarios de Couchbase de toda la vida.
A modo de comparación rápida, he aquí algunas API del SDK de Java 2.x:
|
1 2 3 |
<D extiende Documento<?>> D insertar(D documento, PersistTo persistTo, ReplicateTo replicateTo); AsyncViewResult consulta(ViewQuery consulta); AsyncN1qlQueryResultado consulta(N1qlQuery consulta); |
Y luego, por supuesto, están las sobrecargas de tiempo:
|
1 2 3 |
<D extiende Documento<?>> D insertar(D documento, PersistTo persistTo, ReplicateTo replicateTo, largo tiempo de espera, Unidad de tiempo timeUnit); VerResultado consulta(ViewQuery consulta, largo tiempo de espera, Unidad de tiempo timeUnit); N1qlQueryResultado consulta(N1qlQuery consulta, largo tiempo de espera, Unidad de tiempo timeUnit); |
Compárelo con la nueva API:
|
1 2 3 |
MutationResult insertar(Cadena id, Objeto contenido, InsertOptions opciones); Resultado de la consulta consulta(Cadena declaración, Opciones de consulta pciones); VerResultado viewQuery(Cadena designDoc, Cadena viewName, VerOpciones opciones); |
Cada método devuelve un Resultado y tiene un bloque opcional al final llamado Opciones. El viejo Documento se ha sustituido por un equivalente más sencillo y regular en toda la API. Las propiedades opcionales como el tiempo de espera, los requisitos de durabilidad o el CAS se han trasladado al parámetro de opciones, lo que reduce las sobrecargas y permite buscar en un único lugar.
En posteriores entradas del blog se profundizará en la remodelación de la API, pero por ahora pasemos a las mejoras específicas de Java.
Mejoras específicas de Java
Los dos cambios más visibles para el usuario son:
- Java 8 como versión básica de Java
- API reactivas migradas de RxJava a Reactor
RxJava 1.x nos ha servido bien durante muchos años (de hecho, hemos sido uno de los primeros en adoptarlo), pero desde que se ha marcado como fin de vida hemos tenido que buscar alternativas. Junto con el hecho de que reactive-streams emergió como el estándar de facto para la integración entre las diferentes implementaciones, tuvimos que decidir entre RxJava 2.x y reactor. Mientras que ambos estaban cabeza a cabeza en el rendimiento (en su mayoría), después de un largo período de evaluación nos decidimos por reactor por las siguientes razones:
- java 8 api nativo
- Rendimiento ligeramente superior en algunas de nuestras cargas de trabajo clave.
- más tracción por parte de la comunidad y crecimiento constante (también debido a estar integrado en el núcleo de spring)
Si tu plataforma de aplicaciones está construida en RxJava 2, no temas: como ambos soportan flujos reactivos, puedes simplemente conectarlo encima de nuestras APIs reactivas.
En el SDK 2.x, disponíamos de dos API: una API de bloqueo y una API asíncrona expuestas a través de RxJava. En el SDK 3 hemos añadido una tercera API para darte aún más control:
- la API de bloqueo se mantiene
- Una API reactiva expone las respuestas Mono y Flux del reactor
- La API asíncrona expone CompletableFutures, que pueden utilizarse como bloques de construcción si se necesita el máximo nivel de rendimiento.
Por último, pero no menos importante, una mejora importante para todas las API de consulta reactiva es el soporte opcional para la contrapresión. Si necesitas leer resultados enormes y quieres evitar ponerlos todos en el montón a la vez, ahora puedes usar los mecanismos de contrapresión del reactor que estamos extendiendo a nuestra capa interna de E/S asíncrona. Estamos preparando otra entrada de blog en profundidad para este tema, ¡así que permanece atento!
Primeros pasos
Si quieres probarlo, puedes hacerlo desde nuestro repositorio maven de versiones preliminares:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<repositories> <repository> <id>couchbase</id> <name>Repositorio Couchbase Preview</name> <url>https://files.couchbase.com/maven2</url> </repository> </repositories> <dependencies> <dependency> <groupId>com.couchbase.client</groupId> <artifactId>java-client</artifactId> <version>3.0.0-alfa.4</version> </dependency> </dependencies> |
Una vez resueltas las dependencias, puedes conectarte a cualquier cluster que sea anterior a Couchbase Server 5.0. A continuación, abre un bucket y utiliza la colección que prefieras (el soporte de colecciones ya forma parte de la API de una próxima versión de Couchbase Server). Para versiones anteriores sólo tienes que seleccionar la opción defaultCollection y simplemente funcionará:
|
1 2 3 |
Grupo grupo = Grupo.conecte("localhost", "nombre de usuario", "contraseña"); Cubo cubo = grupo.cubo("nombre-cubo"); Colección colección = cubo.defaultCollection(); |
Ahora puedes escribir y leer un documento:
|
1 2 3 4 5 6 7 8 |
// Insertar documento MutationResult upsertResultado = colección.upsert( "mi-documento", JsonObject.crear().poner("nombre", "mike") ); // Obtener documento Opcional<GetResult> obtenerResultado = colección.consiga("mi-documento"); |
Si quiere saber más, eche un vistazo a nuestro nuevo documentación que se está escribiendo y desarrollando constantemente. También puede buscar ejemplos de código aquí.