[This blog was syndicated from http://blog.grallandco.com]
Introducción
Diseño
- copiar las versiones del documento en nuevos documentos
- copiar las versiones del documento en una lista de documentos incrustados
- almacenar la lista de atributos que se han cambiado en un elemento incrustado (o nuevos documentos)
- guardar el "delta"
- ...
- La versión actual es una simple Clave/Documento, sin cambios en la clave.
- La versión es una copia del documento, y el número de versión se añade a la clave.
Versión actual | mykey |
Versión 1 | miclave::v1 |
Versión 2 | mykey::v2 |
… | … |
Con este enfoque, las aplicaciones existentes siempre utilizarán la versión actual del documento, ya que la clave no se modifica. Pero este enfoque crea nuevos documentos que serán indexados por las vistas existentes.
Por ejemplo, en la aplicación Beer Sample, se utiliza la siguiente vista para listar la cerveza por su nombre:
if(doc.type && doc.type == "beer") {
emit(doc.nombre);
}
}
Es bastante sencillo "soportar" el versionado sin afectar al código existente, excepto a la propia vista. La nueva vista necesita emitir keys,value sólo para la versión actual del documento. Este es el código de la nueva vista:
if(doc.type && doc.type == "beer" && (meta.id).indexOf("::v") == -1 ) {
emit(doc.nombre);
}
}
Aplicación del control de versiones
- Obtener la versión actual del documento
- Incrementar el número de versión (por ejemplo, utilizando otra clave que mantenga el número de versión de cada documento).
- Crear la versión con la nueva clave "mykey::v1"
- Guardar la versión actual del documento
if (obj != null) {
// obtener la siguiente versión, crear o utilizar la clave: mykey_version
long version = client.incr(key + "_version", 1, 1);
String keyForVersion = key + "::v" + version; // mykey::v1
intentar {
client.set(keyForVersion, obj).get();
} catch (Exception e) {
logger.severe("No se puede guardar la versión "+ versión + " de la clave "+ clave +" - Error: "+ e.getMessage() );
}
}
cliente.set(clave, valor);
Muy sencillo, ¿verdad?
La aplicación puede acceder al documento utilizando la clave, pero también obtener una versión o la lista de todas las versiones, esta es una de las razones por las que es interesante crear una clave (mi_version_clave), y utilízalo también para eliminar documentos y versiones relacionadas.
Basándonos en el comentario anterior, la operación de borrado tiene el siguiente aspecto:
// primero hay que borrar todas las versiones
Objeto vObject = this.get(key + "_version");
if (vObject != null) {
long biggerVersion = Long.parseLong((String) vObject);
intentar {
// borrar todas las versiones
for (int i = 1; i <= biggerVersion; i++) {
String versionKey = clave + "::v" + i;
client.delete(versionKey).get();
}
// borrar el contador
client.delete(clave + "_version").get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
cliente.eliminar(llave);
Utilizar el control de versiones
cd cómo-versionar
mvn clean install
…
com.couchbase.howtos
couchbase-cómo-versionar
1.0-SNAPSHOT
couchbase
couchbase-client
1.1.8
…
Codifique su aplicación
Crear un documento y versionarlo:
uris.add(URI.create("http://127.0.0.1:8091/pools"));
CouchbaseClientWithVersioning cliente = null
intentar {
client = new CouchbaseClientWithVersioning(uris, "default", "");
Cadena clave = "clave-001";
client.set(key, "Esta es la versión original");
System.out.printf("Original '%s' .n", client.get(key));
client.set(key, "Esta es una nueva versión", true); // crear una nueva versión
System.out.printf("Versión actual '%s' .n", client.get(key));
System.out.printf("Versión 1 '%s' .n", client.get(key, 1));
client.set(key, "Esta es otra versión", true); // crear una nueva versión
System.out.printf("Todas las versiones %s .n", client.getAllVersions(key));
client.deleteVersion(key, 1); // crear una nueva versión
System.out.printf("Todas las versiones %s (después de eliminar 1 versión).n", client.getAllVersions(key));
client.delete(key); // crear una nueva versión
System.out.printf("Todas las versiones %s (después de borrar la clave principal).n", client.getAllVersions(key));
} catch (Exception e) {
e.printStackTrace();
}
if (cliente !=null) {
client.shutdown();
}
Explicación rápida:
- Línea 5: en lugar de utilizar CouchbaseClientla aplicación utiliza la extensión CouchbaseClientWithVersioning clase.
- Línea 7: crear una nueva entrada
- Línea 9: crear una nueva versión, el valor booleano a "true" fuerza el versionado del documento
- La aplicación utiliza otros métodos como obtener una versión específica (línea 11), obtener todas las versiones (línea 13), borrar una versión específica (línea 14), y finalmente borrar la clave y todas las versiones (línea 16).
client.setAutomaticVersionning(true);
Con este enfoque puedes proporcionar versionado a tu aplicación con un cambio mínimo de código. Puede probarlo en la aplicación Beer Sample, simplemente no olvide cambiar las vistas como documenter arriba para que sólo devuelvan actual versión de los documentos.
Conclusión
En este código de ejemplo específico, estoy trabajando con un diseño simple donde creo una copia de los documentos para cada versión. Con este enfoque también, es interesante mencionar que se puede versionar "cualquier cosa", no sólo documento JSON sino también cualquier valor. Como he dicho antes, este es un enfoque posible, y como cualquier diseño, tiene algún impacto en la aplicación o base de datos, en este caso la mayoría de la base de datos:
- Aumentar el número de llaves y documentos
- Duplicar -o más- el número de operaciones, por ejemplo al actualizar un documento, la aplicación necesita obtener el valor actual, crear una versión, guardar la versión actual.
- Gestión de la coherencia al añadir una nueva versión e incrementar el número de versión (es necesario tratar los errores al crear una nueva versión, eliminar las versiones y contra....).
- Limitar a un número determinado de versiones,
- Habilitar el versionado sólo de la operación replace()
- Añadir atributo específico sobre versiones en documento JSON (por ejemplo fecha de la versión)
- ….
Si estás usando versionado en tu aplicación Couchbase, siéntete libre de comentar o escribir un pequeño artículo que describa la forma en que lo estás haciendo.