Use o aplicativo Codename: BlueMix DataCache service in a Node.js

Este artigo explica como usar o aplicativo Codename: BlueMix DataCache service in a Node.js. Também oferece uma biblioteca do cliente que pode ser ampliada e utilizada em outros aplicativos Node.js hospedados no BlueMix.

Um cache de dados distribuído pode melhorar o tempo de resposta de apresentação de um aplicativo baseado na nuvem ao colocar em cache as respostas a solicitações frequentes do usuário. Um cache distribuído também oferece o benefício de baixar a camada do serviço de dados: os componentes do aplicativo que proporcionam persistência de dados. Um serviço de cache distribuído ajuda a construir aplicativos que respondem.

Este artigo explica como usar o serviço DataCache em um aplicativo Node.js hospedado por Codename: BlueMix. O DataCache é um cache distribuído (operado pela tecnologia WebSphere eXtreme Scale) que pode ser usado como um armazém de dados eficiente e confiável de valor chave. Oferecemos um módulo de cliente Node.js que pode ser ampliado e utilizado nos aplicativos escolhidos para serem hospedados no BlueMix. O serviço DataCache é usado sobre a rede através da sua REST API. O módulo de cliente abstrai os bits REST, proporcionando métodos de nível mais alto para gerenciar objetos de valor chave.

O que é necessário para construir um aplicativo similar

  • Estar familiarizado com a escritura de aplicativos da Web em um ambiente de desenvolvimento de um Node.js utilizando o framework do aplicativo Web Express e o motor de matrizes Jade
  • Conhecimentos básicos sobre a plataforma Cloud Foundry (a base do BlueMix) e o modelo de programação de composição do serviço
  • JazzHub e contas BlueMix
  • A interface da linha de comando cf que pode baixar diretamente do BlueMix Web UI

Um serviço de cache distribuído ajuda a construir aplicativos que respondem.

Executar o aplicativo

Obter o código no JazzHub

Nota: Se você quiser usar um fork no código para este exercício no JazzHub, clique no botão EDIT CODE no canto superior direito (capture suas credenciais JazzHub se ainda não iniciou a sessão e clique no botão FORK do menu para criar um projeto novo.

Node.js para desenvolvedores Java

Gerencie os requisitos não funcionais para os aplicativos da nuvem


Passo 1: Abra o aplicativo no BlueMix

Obtenha o código. Para usar a linha de comando Git para baixar o código do meu projeto JazzHub para um diretório local chamado datacache-sample, execute:

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

Agora abra o aplicativo no BlueMix:

  1. Inicie sessão na sua conta BlueMix usando a linha de comando cf.
  2. Selecione um nome único para seu aplicativo (estou usando datacache-sample. Coloque o que você quiser)
  3. Execute estes comandos, onde THIS_APP representa o nome escolhido para o aplicativo:
     cd datacache-sample cf push THIS_APP

O comando push dá saída à informação verbosa ao console. As últimas linhas de um processo bem-sucedido aparecem assim:

Clique aqui para ver 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

Agora você pode conectar ao aplicativo apontando com seu navegador a http://THIS_APP.ng.bluemix.net (consulte a Figura 1).

Figura 1. Página principal de aplicativos imediatamente após a ativação

Passo 2: Vincule um serviço DataCache ao aplicativo

Opa — Esqueci de mencionar que, primeiro, é preciso vincular um serviço DataCache ao aplicativo, de acordo com as instruções do comando da Figura 1. Não é preciso entrar em pânico. Você pode fazer isso simplesmente reiniciando o aplicativo. Execute o comando apresentado na página:

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

Após recarregar a página, você verá que o aplicativo oferece algumas opções utilizáveis (consulte a Figura 2).

Figura 2. Página principal de aplicativos após vincular um serviço DataCache ao aplicativo

O que aconteceu? Como você sabe que não havia sido associado um serviço DataCache ao aplicativo no princípio?

Abre-se datacache-sample/app.js (que é o módulo principal do aplicativo, que inicia o servidor Web), e você verá o código que verifica a presença do serviço DataCache na parte superior — na definição da variável de ambiente VCAP_SERVICE:

Clique aqui para ver 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 é o módulo que oculta os bits de REST API do serviço de DataCache, oferecendo métodos de um nível mais alto também se encarrega de distribuir o objeto de credenciais que contêm parâmetros de conectividade para o serviço de DataCache. DCClient se implementa no arquivo datacache-sample/wxs.js.

Se armazena uma referência a DCClient na variável app.locals.dcClt para que as rotas Express possam acessá-las. A rota responsável por entregar a página de índice (datacache-sample/routes/index.js) executa a verificação:

Clique aqui para ver lista de códigos

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

o código anterior entrega a matriz Jade datacache-sample/views/index.jade passando o parâmetro. dataCacheBound O motor de matrizes Jade verifica o valor da variável dataCacheBound e constrói a página principal dessa maneira entregando seja a página na Figura 1 ou a página na Figura 2.


Passo 3: Inserir chaves

Para armazenar um objeto de valor chave na instância DataCache que está vinculada ao aplicativo, clique em Insert a key into a map na página principal.

Quando você cria um serviço DataCache, é criado um mapa predeterminado no qual são armazenados seus objetos de valor chave, para que possa deixar o campo de entrada Map vazio. Mas, em alguns casos, você pode querer especificar diferentes opções de cache para objetos diferentes. Nesses casos, você pode especificar um mapa e o tempo de vida (TTL) dos objetos de valor chave que contêm. Você especifica o valor TTL adicionando um sufixo no nome do mapa:

  • Um mapa cujo nome termina com: .NONE não expira. Para eliminar o mapa, deve ser usado um comando explícito.
  • Um mapa cujo nome termina com: .LUT define um tempo de expiração para seus objetos com base na última hora da sua atualização (LUT): Serão apagados automaticamente se não forem atualizados em um intervalo de tempo superior ao TTL. O valor predeterminado para TTL é uma hora.
  • Um mapa cujo nome termina com: .LAT define um tempo de expiração para seus objetos com base no tempo do último acesso (LAT): Serão eliminados automaticamente se não forem acessados em um intervalo de tempo superior ao TTL. O valor predeterminado para TTL é uma hora.
  • Um mapa cujo nome termina com .CT define um tempo de expiração para seus objetos com base no momento da sua criação (CT): São eliminados automaticamente depois de CT mais TTL. O valor predeterminado de TTL é uma hora.

Tente usar o aplicativo para colocar em cache objetos de valor chave em diferentes tipos de mapas. Se o valor for um objeto JSON, define o campo de tipo de conteúdo a application/json. Se for um objeto XML, defina-o a application/xml. Para qualquer outro tipo de valor, deixe o campo tipo de conteúdo como application/octet-stream.

Defina um nome de mapa sem nenhum dos sufixos e veja o que acontece.

Um único arquivo — datacache-sample/routes/map.js — contém todas as rotas expressas para gerenciar as operações do DataCache. Esta é a porção do arquivo que gerencia a inserção de um objeto de valor chave:

Clique aqui para ver 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() é o método para inserir um objeto em um mapa. Você passa o mapa, senha, valor e os tipos de conteúdo do valor mais a função retorno de chamada que gerencia os resultados. O arquivo datacache-sample/wxs.js inclui ajuda sobre como interpretar o parâmetro passado ao retorno de chamada:

Clique aqui para ver 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.Readável. 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) { // ... }

Passo 4: Obtenha o valor de uma chave

Para obter o valor de uma chave que está armazenada na instância de DataCache unida ao aplicativo, clique no link Get a key from a map na página principal.

Tente recuperando as chaves que inseriu no Passo 3. Tente também obter algumas chaves não existentes. Depois veja o código.

Esta porção do arquivo datacache-sample/routes/map.js gerencia a operação:

Clique aqui para ver 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 com inserir, a parte interessante dcClt.get() da chamada do método e o gerenciamento dos resultados na função de retorno de chamada. O método dcClt.get() toma como entrada o nome do mapa, a chave e a função de retorno de chamada. O arquivo datacache-sample/wxs.js inclui ajuda sobre como interpretar o parâmetro passado ao retorno de chamada:

Clique aqui para ver 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) { // ... }

Passo 5: Eliminar chaves

Use o link Eliminar uma chave de um mapa ou Eliminar todas as chaves de um mapa na página principal para eliminar os objetos com valor chave dos mapas. Como fez para inserir e obter, você pode examinar o código nos arquivos datacache-sample/routes/map.js e datacache-sample/wxs.js files. O objeto WXS define o método remove() para eliminar um objeto de valor chave de um mapa e o método clearMap() para eliminar todos os objetos de valor chave de um mapa.


Conclusão

Com a compreensão que você tem agora sobre as capacidades básicas do serviço DataCache, você pode iniciá-lo rapidamente na plataforma BlueMix. Logo você descobrirá mais características deste serviço, que incluem um painel DataCache (ver a Figura 3) ao qual se acessa a partir da BlueMix Web UI. O painel mostra o uso do serviço e como está se comportando.

Figura 3. Painel DataCache

Clique para ver a imagem maior

Figura 3. Painel DataCache

Eu os convido a obter o módulo WXS Node.js ampliá-lo para seus propósitos e compartilhá-lo com a comunidade. Você pode baixar uma biblioteca similar para a linguagem Java ™ diretamente do BlueMix WebUI nas páginas de documentação do serviço DataCache.

Comentários

developerWorks: Conecte-se

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


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

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

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Cloud computing, WebSphere
ArticleID=970249
ArticleTitle=Use o aplicativo Codename: BlueMix DataCache service in a Node.js
publish-date=04062014