100 veces menos código

Couchbase Mobile puede hacerte 100 veces más productivo. Al igual que Ruby on Rails revolucionó la concepción de los servicios web Al ofrecer una forma concisa de modelar aplicaciones web basadas en REST y servidores API, la función de sincronización en el corazón de Couchbase Sync Gateway puede revolucionar la forma de gestionar los datos de las aplicaciones móviles.

Atrás quedaron los días de escribir a mano servidores API y código de cliente REST móvil. Nunca recuperarás esas horas dedicadas a gestionar errores de funcionamiento de la red, pero al menos no tiene por qué volver a ocurrir.

Con una base de datos local en el teléfono (algo basado en JSON podría ser preferible a Core Data o SQLite, ya que estamos en 2014) puede ser tan sencillo como pedir a un objeto modelo que se guarde a sí mismo. Tanto si el teléfono está en modo avión, como si está en una conexión 3G saturada o conectado a una WiFi de alto rendimiento, el usuario nunca notará una diferencia en la capacidad de respuesta. 

Ojalá hubiera una forma de obtener el rendimiento y la fiabilidad de los primeros datos locales, sin renunciar a las partes buenas de la nube. Con una base de datos local con capacidad de sincronización, los cambios se pueden sincronizar automáticamente con la nube, sin necesidad de escribir una tonelada de código de red. Esto puede simplificar radicalmente las aplicaciones cliente móviles, pero el borde es sólo la mitad de la historia. Cuando los datos llegan a la nube, algo tiene que decidir si los cambios son válidos o si deben rechazarse. La nube también es responsable de decidir quién puede ver qué.

En una arquitectura tradicional de datos remotos (del tipo que acribilla tu aplicación móvil con llamadas de red), la validación de actualizaciones y el control de acceso de lectura los aplica el servidor de aplicaciones web, que suele ser código personalizado con una relación ad hoc con varios servicios backend y bases de datos. Nos hemos acostumbrado a escribir servidores API de esta manera, pero eso no significa que nos tenga que gustar.

En lugar de un enfoque costoso donde cada punto final REST requiere código personalizado, Sync Gateway habla el protocolo de sincronización de Couchbase Mobile y proporciona su propia abstracción concisa para la validación, control de acceso y enrutamiento de datos. Esto significa que en lugar de escribir un servidor que pasa la mayor parte de su lógica de traducción entre la entrada del usuario y las operaciones de base de datos y consultas, sólo puede especificar el comportamiento que desea y dejar Sync Gateway manejar los detalles.

En Sync Gateway, el comportamiento personalizado de la aplicación se expresa en una función JavaScript que ofrece un control sencillo pero detallado de sus datos. Para más detalles consulte la documentación de la función syncPor ahora sólo te mostraré uno y luego describiré cómo funciona.

Esta es la función de sincronización de nuestra aplicación de ejemplo, ToDo Lite. Puede conozca el código móvil de ToDo Lite en nuestro portal para desarrolladores. El mismo backend admite el iOS, Androidy PhoneGap versiones.

function(doc, oldDoc) {
if (doc.type == "task") {
if (!doc.list_id) {
throw({forbidden : "Los elementos deben tener un list_id"})
}
requireAccess("lista-"+doc.lista_id);
channel("lista-"+doc.lista_id);
} else if (doc.type == "list") {
channel("lista-"+doc._id);
if (!doc.owner) {
throw({prohibido : "La lista debe tener un propietario"})
}
if (oldDoc) {
requireUser(oldDoc.owner)
}
access(doc.owner, "lista-"+doc._id);
if (Array.isArray(doc.members)) {
access(doc.members, "lista-"+doc._id);
}
} else if (doc.type == "profile") {
channel("perfiles");
var user = doc._id.substring(doc._id.indexOf(":")+1);
if (user !== doc.user_id) {
throw({forbidden : "Profile user_id must match docid : " + user + " : " + doc.user_id})
}
requireUser(usuario);
access(usuario, "perfiles");
}
}

Vamos a ir poco a poco y ver cómo podemos encajar la mayor parte de lo que su servidor de aplicaciones web REST hace, en una página de código.

function(doc, oldDoc) {

La función de sincronización se ejecuta en cada mutación de forma independiente, y toma dos argumentos: la versión propuesta del documento, y la versión anterior del documento, si existe. La versión anterior es útil para validar cosas como que la persona que realiza el cambio es la propietaria de este documento, o quizás tu aplicación impone que ciertos campos del documento sean inmutables.

  if (doc.type == "task") {
if (!doc.list_id) {
throw({forbidden : "Los elementos deben tener un list_id"})
}
requireAccess("lista-"+doc.lista_id);
channel("lista-"+doc.lista_id);

Este bloque se ejecuta si el documento representa una tarea individual en ToDo Lite. Requiere que el documento tenga un campo list_id, y que el usuario que está actualizando o creando la tarea tenga acceso a esa lista. Si se supera la validación, el documento se envía a un canal para esa lista. La próxima vez que alguien que tenga acceso a la lista se conecte, sincronizará la tarea actualizada.

  } else if (doc.type == "list") {
channel("lista-"+doc._id);

Esta sección trata de los metadatos asociados a una lista. La llamada a "canal" dirigirá los metadatos de la lista al canal asociado a la lista (suponiendo que se superen las validaciones de este documento).

    if (!doc.owner) {
throw({prohibido : "La lista debe tener un propietario"})
}
if (oldDoc) {
requireUser(oldDoc.owner)
}

Las validaciones para los documentos de lista son simples: todas las listas deben tener un propietario, y las listas sólo pueden ser actualizadas por su propietario. (Nótese que podemos expresar las validaciones y el enrutamiento en cualquier orden - si la validación falla entonces cualquier otra llamada de esta invocación de la función sync no tendrá efecto).

    access(doc.owner, "lista-"+doc._id);
if (Array.isArray(doc.members)) {
access(doc.members, "lista-"+doc._id);
}

Lo último que queremos hacer con el documento de metadatos de la lista es utilizarlo para conceder acceso, de modo que las personas adecuadas puedan leer desde el canal de la lista. La primera llamada a "access" asegura que el propietario de la lista puede sincronizar los elementos de esta lista de tareas. A la segunda llamada se le pasa un array de miembros, concediendo a cada uno de ellos acceso a la lista. Estas concesiones de acceso también afectarán a quién puede escribir tareas en la lista, debido a la llamada a "requireAccess" que hicimos en el primer bloque de esta función.

  } else if (doc.type == "profile") {
channel("perfiles");

El bloque final de la función de sincronización de ToDo Lite es responsable de asegurarse de que la lista de usuarios de la aplicación esté disponible para cada usuario, de modo que los usuarios puedan seleccionarse mutuamente como miembros de las listas. La primera línea de código de este bloque dirige los documentos de perfil de usuario al canal "perfiles".

    var user = doc._id.substring(doc._id.indexOf(":")+1);
if (user !== doc.user_id) {
throw({forbidden : "Profile user_id must match docid : " + user + " : " + doc.user_id})
}
requireUser(usuario);

La validación de los perfiles garantiza que el documento cumple un requisito del esquema (el ID del documento debe coincidir con el nombre de usuario de su creador). También impide que alguien edite el perfil de otra persona.

La última línea de código puede resultar engañosamente sencilla. Concede al usuario acceso al canal "perfiles". Esto significa que cuando un nuevo usuario crea su propio perfil, el sistema reacciona dándole acceso de lectura al perfil de todos los demás a través del canal "perfiles".

    access(usuario, "perfiles");
}
}

Este recorrido por una función de sincronización de ejemplo muestra la mayoría (pero no todas) de las herramientas que ofrece. Puedes imaginarte la cantidad de código que se necesitaría para escribir un servidor REST API que aplique reglas similares. Mucho más. Y resolver el problema de la sincronización offline seguiría estando en tu lista de tareas pendientes.

Entonces, ¿serás 100 veces más productivo con Couchbase Mobile?

Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Autor

Publicado por J. Chris Anderson, cofundador y arquitecto móvil, Couchbase

4 Comentarios

  1. Además, toda la pila es de código abierto y está disponible bajo la licencia Apache 2.

  2. \"¡100 veces menos código!" no tiene sentido: http://timesless.com/

  3. Aliaksey Kandratsenka mayo 21, 2014 a 10:40 pm

    En mi post de G+ que enlaza aquí (https://plus.google.com/+Aliak... ) Recibí los siguientes comentarios:

    * que es importante destacar la diferencia con otras opciones posibles (parse.com se mencionó)

    * y que el formato del blog podría mejorarse especialmente en móviles

  4. Algunos de los comentarios en Reddit fueron que este artículo no da suficiente descripción del problema que se resuelve. Escribí un artículo para abordar ese punto: http://tleyden.github.io/blog/

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.