Use la aplicación Codename: BlueMix DataCache service in a Node.js

07-03-2014
PDF (300 KB)
 

Michele Crudele

Software Architect

Michele Crudele

Un caché de datos distribuido puede mejorar el tiempo de respuesta al nivel de una presentación de una aplicación centrada en la nube al poner en caché las respuestas a solicitudes frecuentes del usuario. Un caché distribuido también tiene el beneficio de descargar la capa del servicio de datos: los componentes de la aplicación que proporcionan persistencia de datos. Un servicio de caché distribuido le ayuda a construir aplicaciones que responden.

Este artículo explica cómo usar el servicio DataCache en una aplicación Node.js alojada por Codename: BlueMix. DataCache es un caché distribuido (operado por la tecnología WebSphere eXtreme Scale) que puede usar como un almacén de datos eficiente y confiable de valor clave. Yo le doy un módulo de cliente Node.js que usted puede ampliar y usar en las aplicaciones que elija alojar en BlueMix. Usted usa el servicio DataCache sobre la red a través de su REST API. El módulo de cliente abstrae los bits REST, proporcionando métodos de nivel más alto para administrar objetos de valores claves.

Lo que necesita para construir una aplicación similar

 
  • Estar familiarizado con la escritura de aplicaciones Web en un ambiente de desarrollo de un Node.js utilizando el framework de la aplicación Web Express y el motor de matrices Jade
  • Conocimientos básicos de la plataforma Cloud Foundry (el cimiento de BlueMix) y el modelo de programación de composición del servicio
  • JazzHub y cuentas BlueMix
  • La interfaz de la línea de comando cf que puede descargar directamente de BlueMix Web UI

Un servicio de caché distribuido que le ayuda a construir aplicaciones que responden.

Ejecutar la aplicación

Obtener el código en JazzHub

Nota: Si quiere usar un fork en el código para este ejercicio en JazzHub, haga clic en el botón EDIT CODE en la esquina superior derecha (capture sus credenciales JazzHub si no ha iniciado sesión todavía y haga clic en el botón FORK del menú para crear un proyecto nuevo.

Node.js para desarrolladores Java

Administre los requisitos no funcionales para las aplicaciones de la nube

Paso 1: Despliegue la aplicación a BlueMix

 

Obtenga el código. Para usar la línea de comando Git para descargar el código de mi proyecto JazzHub a un directorio local llamado datacache-sample, ejecute:

 git clone https://hub.jazz.net/git/mcrudele/datacache-sample

Ahora despliegue la aplicación a BlueMix:

  1. Inicie sesión en su cuenta BlueMix usando la línea de comando cf.
  2. Seleccione un nombre único para su aplicación (estoy usando datacache-sample. Cámbielo al que usted quiera)
  3. Ejecute estos comandos, donde THIS_APP representa el nombre que haya elegido para la aplicación:
     cd datacache-sample cf push THIS_APP

El comando push le da salida a información verbosa a la consola. Las últimas líneas de un despliegue exitoso se ven como esto:

Haga clic para ver la lista de códigos

 -----> Uploading droplet (16M) 1 of 1 instances running App started Showing health and status for app datacache-sample in org your.name@your.mail / space dev as your.name@your.mail... OK requested state: started instances: 1/1 usage: 1G x 1 instances urls: datacache-sample.ng.bluemix.net state since cpu memory disk #0 running 2014-02-21 06:04:16 PM 0.0% 12.1M of 1G 35.5M of 1G

Ahora se puede conectar a la aplicación apuntando con su navegador a http://THIS_APP.ng.bluemix.net (consulte la Figura 1).

Figura 1. Página principal de aplicaciones inmediatamente después del despliegue
Screen shot of the sample app before a DataCache service is bound to the app

Paso 2: Vincule un servicio DataCache a la aplicación

 

Oops — Se me olvidó mencionar que primero necesita vincular un servicio DataCache a la aplicación, lo que da cuenta de las instrucciones del comando en la Figura 1. No hay necesidad de entrar en pánico. Puede hacer eso simplemente reiniciando la aplicación. Ejecute el comando que se lista en la página:

 cf create-service DataCache free SERVICE_NAME cf bind-service THIS_APP SERVICE_NAME cf restart THIS_APP

Después de volver a cargar la página, puede ver que la aplicación le da algunas opciones utilizables ahora (consulte la Figura 2).

Figura 2. Página principal de aplicaciones después de que se vincula un servicio DataCache a la aplicación
Screen shot of the sample app after a DataCache service is bound to the app

¿Qué sucedió? ¿Cómo sabe que no se había asociado un servicio DataCache con la aplicación al principio?

Si abre datacache-sample/app.js (que es el módulo principal de la aplicación, el que inicia el servidor Web), usted verá el código que verifica la presencia del servicio DataCache en la parte superior — en la definición de la variable de ambiente VCAP_SERVICE:

Haga clic para ver la lista de códigos

 var app = express(); if ( process.env.VCAP_APP_PORT ) { // We are in BlueMix if (process.env.VCAP_SERVICES) var env = JSON.parse(process.env.VCAP_SERVICES); } if ( env && env['DataCache-1.0'] && env['DataCache-1.0'][0] && env['DataCache-1.0'][0].credentials ) { // Create the DataCache client app.locals.dcClt = new DCClient(env['DataCache-1.0'][0].credentials); }

DCClient es el módulo que oculta los bits de REST API del servicio de DataCache, ofreciendo métodos de un nivel más alto También se encarga de distribuir el objeto de credentials que contiene parámetros de conectividad para el servicio de DataCache. DCClient se implementa en el archivo datacache-sample/wxs.js.

Se almacena una referencia a DCClient en la variable app.locals.dcClt para que las rutas Express puedan acceder a ellas. La ruta responsable de entregar la página de índice (datacache-sample/routes/index.js) ejecuta la verificación:

Haga clic para ver la lista de códigos

 exports.index = function(req, res){ res.render('index', { title: 'DataCache Example Application', dataCacheBound: (req.app.locals.ecClt?true:false) }); };

El código anterior entrega la matriz Jade datacache-sample/views/index.jade pasando el parámetro. dataCacheBound El motor de matrices Jade verifica el valor de la variable dataCacheBound y construye la página principal de esa manera entregando ya sea la página en la Figura 1 o la pagina en la Figura 2.

Paso 3: Insertar claves

 

Para almacenar un objeto de valor clave en la instancia DataCache que está vinculada a la aplicación, haga clic en Insert a key into a map en la página principal.

Cuando usted crea un servicio DataCache, se crea un mapa predeterminado donde se almacenan sus objetos de valor clave, para que pueda dejar el campo de entrada Map vacío. Pero en algunos casos, usted puede querer especificar diferentes opciones de caché para objetos diferentes. En esos casos, usted puede especificar un mapa y el tiempo de vida (TTL) de los objetos de valor clave que contiene. Usted especifica el valor TTL en un sufijo al nombre del mapa:

  • Un mapa cuyo nombre termina con: .NONE no expira. Para eliminar el mapa, debe usar un comando explícito.
  • Un mapa cuyo nombre termina con: .LUT define un tiempo de expiración para sus objetos con base en la última hora de su actualización (LUT): Se borrarán automáticamente si no son actualizados por más que el TTL. El valor predeterminado para TTL es una hora.
  • Un mapa cuyo nombre termina con: .LAT define un tiempo de expiración para sus objetos con base en el tiempo del último acceso (LAT): Se eliminan automáticamente si no se accede a ellos por más del TTL. El valor predeterminado para TTL es una hora.
  • Un mapa cuyo nombre termina con .CT define un tiempo de expiración para sus objetos con base en el momento de su creación (CT): Son eliminados automáticamente después de CT más TTL. El valor predeterminado de TTL es una hora.

Intente usar la aplicación para poner en caché objetos de valor clave en diferentes tipos de mapas. Si el valor es un objeto JSON, establezca el campo de tipo de contenido a application/json. Si es un objeto XML, establézcalo a application/xml. Para cualquier otro tipo de valor, dejar el campo tipo de contenido como application/octet-stream.

Establezca un nombre de mapa sin ninguno de los sufijos y vea que sucede.

Un sólo archivo — datacache-sample/routes/map.js — contiene todas las rutas exprés para manejar las operaciones del DataCache. Esta es la porción del archivo que maneja la inserción de un objeto de valor clave:

Haga clic para ver la lista de códigos

 exports.postkey = function(req, res) { var dcClt = req.app.locals.dcClt; if ( dcClt ) { var map = req.body.map; if ( map && map.trim().length==0 ) map = null; dcClt.put(map, req.body.key, req.body.value, req.body.contentType, function(err) { if ( err ) { var msg = 'Cannot insert key *' + req.body.key + '* with value *' + req.body.value + '* and contentType *' + req.body.contentType + '*.'; var dtls = 'Message details. Status: ' + err.status + ', Message: ' + err.message; res.render('response', { title: 'Error', message: msg, details: dtls }); } else { msg = 'The key *' + req.body.key + '* has been inserted into map with value *' + req.body.value + '* and contentType *' + req.body.contentType + '*.'; res.render('response', { title: 'Success', message: msg}); } }); } else { res.render('response', { title: 'Error', message: 'There is no DataCache service associated with the App.' }); } };

dcClt.put() es el método para llamar para insertar un objeto en un mapa. Usted pasa el mapa, clave, valor y los tipos de contenido del valor más la función retorno de llamada que maneja los resultados. El archivo datacache-sample/wxs.js incluye ayuda sobre cómo interpretar el parámetro pasado al retorno de llamada:

Haga clic para ver la lista de códigos

 /** * Cache a key/value pair in a map. * * @param map, map the map name * @param key the name of the key * @param value the value, which may represent an xml, json, or anything else, * depending on content type. The value should be a string, * an object or a stream.Readable. If it is an object the * the JSON.stringify() will be applied before sending out. * @param contentType the type of the value application/xml, application/json, * application/octet-stream * @param callback(err) the function handling the result of the post. In case of failure * result is an Error object thay may contain the fields * status: < response status code >, message: < data sent with the * response >, responseHeaders: <the headers in the response >. * in case of success nothing is passed to the callback. */ put : function(map, key, value, contentType, size, callback) { // ... }

Paso 4: Obtenga el valor de una clave

 

Para obtener el valor de una clave que está almacenada en la instancia de DataCache unida a la aplicación, haga clic en el vínculo Get a key from a map en la página principal.

Inténtelo recuperando las claves que insertó en el Paso 3. También intente obtener algunas claves no existentes. Luego, vea el código.

Esta porción del archivo datacache-sample/routes/map.js maneja la operación:

Haga clic para ver la lista de códigos

 exports.getkey = function(req, res) { var dcClt = req.app.locals.dcClt; if ( dcClt ) { var map = req.body.map; if ( map && map.trim().length==0 ) map = null; dcClt.get(map, req.body.key, function(result) { if ( result instanceof Error ) { var msg = 'Cannot get key *' + req.body.key + '*'; var dtls = 'Message details. Status: ' + result.status + ', Message: ' + result.message; res.render('response', { title: 'Error', message: msg, details: dtls }); } else { var msg = '<div>Value of key <strong>' + req.body.key + '</strong> is<br><xmp>' + result.responseText + '</xmp><br>and contentType is <strong>' + result.responseHeaders['content-type'] + '</strong></div>'; res.render('response', { title: 'Success', message: msg }); } }); } else { res.render('response', { title: 'Error', message: 'There is no DataCache service associated with the App.' }); } };

Como con insertar, la parte interesante de dcClt.get() de la llamada del método y el manejo de los resultados en la función de retorno de llamada. El método dcClt.get() toma como entrada el nombre del mapa, la clave y la función de retorno de llamada. El archivo datacache-sample/wxs.js incluye ayuda en cómo interpretar el parámetro pasado al retorno de llamada:

Haga clic para ver la lista de códigos

 /** * Get the value of a key in a map. * * @param map the map name * @param key the name of the key * @param callback(val) the function handling the result of the get. in case of failure * result is an Error object that may contain the fields * status: < response status code >, message: < data sent with the * response >, responseHeaders: < the headers in the response >. * in case of success val is an object with: * status: < response status code>, responseText: < value of key in map>, * responseHeaders: < the headers in the response >. You can read * the type of the value from the content-type header of the response. */ get : function(map, key, callback) { // ... }

Paso 5: Eliminar claves

 

Use el vínculo Eliminar una clave de un mapa o Eliminar todas las claves de un mapa en la página principal para eliminar los objetos con valor clave de los mapas. Como hizo para insertar y obtener, usted puede examinar el código en los archivos datacache-sample/routes/map.js y datacache-sample/wxs.js files. El objeto WXS define el método remove() para eliminar un objeto de valor clave de un mapa y el método clearMap() para eliminar todosl los objetos de valor clave de un mapa.

Conclusión

 

Con la comprensión que tiene ahora de las capacidades básicas del servicio DataCache, usted puede iniciarlo rápidamente en la plataforma BlueMix. Pronto descubrirá más características del servicio, que incluyen un tablero DataCache (ver la Figura 3) al que se accede desde la BlueMix Web UI. El tablero muestra su uso del servicio y cómo se está comportando.

Figura 3. Tablero DataCache
Screen shot of the BlueMix DataCache dashboard

Haga clic para ampliar la imagen

Figura 3. Tablero DataCache

Screen shot of the BlueMix DataCache dashboard

Lo invito a obtener el módulo WXS Node.js ampliarlo para sus propósitos y compartirlo con la comunidad. Usted puede descargar una biblioteca similar para el lenguaje Java ™ directamente del BlueMix WebUI en las páginas de documentación del servicio DataCache.

Agregar un comentario

Nota: los elementos en HTML no son soportados dentro de los comentarios.


quedan 1000 caracteres

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Cloud computing, WebSphere
ArticleID=966503
ArticleTitle=Use la aplicación Codename: BlueMix DataCache service in a Node.js
publish-date=03072014