Cómo trabajar con Service Bus desde Node.js
Service Bus es una infraestructura de mensajería que permite a las aplicaciones intercambiar mensajes entre ellas de una manera desacoplada soportando escalabilidad. Service Bus está operado por completo por Microsoft y tiene un SLA mensual de 99.9%
Servicios dentro de Service Bus
Dentro de Service Bus existen diferentes tipos de servicios que se pueden consumir:
Topics / Subcriptions
Este servicio permite crear y consumir un sistema de mensajería basada en un modelo de publicador consumidor. De esta manera las aplicaciones distribuidas o distintos componentes, no se comunican de manera directa, sino que utilizan un topic que actúa de intermediario.
Relay Service
El servicio de Service Bus Realy Service permite construir aplicaciones hibridas que se ejecutan en Windows Azure y entornos on-premises locales. Este servicio permite exponer servicios de Windows Communication Services (WCF) que están dentro del firewall corporativo para que sean consumidos desde la nube pública.
Service Bus Queues
Este servicio soporta un sistema basado en brokers que permite la comunicación basado en mensajes. De esta manera las aplicaciones no se comunican de manera directa si no que se comunican a través del intercambio de mensajes.
Como consumir Service Bus desde Node.js
En el ejemplo de código se puede descargar desde GitHub se había estado trabajando con el SDK de Windows Azure para Node.js. Así que se va a continuar con esta misma demo haciendo que el código sea capaz de enviar mensajes a una cola de Service Bus.
Cómo un servicio de Service Bus desde el portal
Para poder conectarse al servicio primero hay que crear un servicio de Service Bus en el portal de Windows Azure, para ello hay que iniciar sesión en el portal y navegar hasta la sección de Service Bus.
Una vez allí hay que pulsar en crear un nuevo servicio. Lo único que solicita el formulario es el nombre del bus y por supuesto el datacenter donde va a estar alojado el servicio.
A partir de aquí se pueden obtener la configuración de conexión del servicio.
Una vez pulsado ese botón se abre un cuadro de dialogo donde se puede obtener el nombre de usuario y la llave predeterminada.
Service Bus en Node.js
Como se ha comentado en post anteriores existe un cliente para poder consumir servicios de Windows Azure, en este caso para poder conectarse a Service Bus hay que crear el cliente pertinente que se puede hacer de esta manera:
var azure = require('azure');
var serviceBusService = azure.createServiceBusService();
De esta manera al crear el cliente de Service Bus así el SDK de Node.js ira a buscar las variables de configuración para conectarse a Windows Azure de dos variables de entorno que están definidas en process.env, que son: AZURE_SERVICEBUS_NAMESPACE y AZURE_SERVICEBUS_ACCESS_KEY
Enviando mensajes a la cola de Service Bus
Para poder enviar mensajes lo primero que hay que hacer es asegurarse de que la cola existe, para eso el cliente de Service Bus tiene una operación llamada createQueueIfNotExits. Esta llamada acepta un objeto que contiene la configuración a la hora de crear la cola, que se puede consultar su documentación online, que permite configurar el tamaño de la cola y la caducidad de los mensajes:
var azure = require('azure');
var serviceBusService = azure.createServiceBusService();
var queueName = 'chat';
var queueOptions = {
MaxSizeInMegabytes : '5120',
DefaultMessageTimeToLive : 'PT10M'
};
serviceBusService.createQueueIfNotExists(queueName, queueOptions, function(error){
//
});
Con esta operación se crear la cola si no existe una vez hecho eso se puede llamar al método sendQueueMessage con el mensaje que se quiere enviar:
var message = {
body : 'Test message',
customProperties : {
testproperty : 'TestValue'}
};
serviceBusService.sendQueueMessage(queueName, message, function(error) {
if (!error) {
renderPayload['mensageSent'] = true;
res.send(renderPayload);
}
});
En el caso de la demo de este artículo se ha creado un servicio que acepta por parámetro un mensaje y es justamente, ese mensaje, el que se envía en la cola. Se ha creado otro servicio que justamente lo que hace es leer el mensaje de la cola por AJAX y mostrarlo en la UI para ver como el mensaje va y viene a través de la infraestructura de Service Bus.
Recibiendo mensajes desde Service Bus
Para recibir un mensaje desde Service Bus lo único que hay que hacer es llamar al método receiveQueueMessage pasando como parámetro el nombre de la cola de donde se quiere leer el mensaje. Como parámetro opcional se puede pasar un objeto que puede contener dos propiedades isPeekLock, que permite definir que solamente se quiere obtener el mensaje sin borrarlos de la cola y timeoutInternalInS que define el timeout a la hora de leer de la cola en segundos.
Cuando se hace una lectura de Service Bus el mensaje se borra automáticamente, esto es así para garantizar el orden FIFO de la cola. La variable de timeout se especifica también porque el sistema no se espera hasta que haya mensajes en la cola, así que si no hay mensajes es una manera de no esperar infinitamente.
serviceBusService.receiveQueueMessage(queueName, { isPeekLock: true }, function(error, lockedMessage){
if(!error){
// Message received and locked
serviceBusService.deleteMessage(lockedMessage, function (deleteError){
if(!deleteError){
// Message deleted
}
});
}
});
Así una vez que se ha leido el mensaje de la cola y se ha procesado el siguiente paso es borrar ese mensaje de la cola para que no esté disponible de nuevo.
En la demo del articulo lo que se está haciendo es leer los mensajes y devolverlos en una respuesta de tipo JSON para mostrarla en la interfaz de usuario de la página de ejemplo.
Demo
La demo cosiste en dos controladores que leen y escriben mensajes en Service Bus y que son utilizados por una tercera vista que se encarga de enviar un mensaje y leerlo.
Para ello se ha generado un HTML que permite enviar mensajes a la cola y los va leyendo de manera automática cada 10 segundos.
Una vez que se ha enviado un mensaje el gestor se encarga de leer los mensajes:
La demo se puede ver en esta url https://dpespainnodejsdemo.azurewebsites.net/queueDemo
El código fuente se puede descargar desde aquí https://github.com/LuisGuerreroDpe/Windows-Azure-Demos/tree/Node.js/Node
Diferencia entre las colas de Windows Azure Storage y Windows Azure Service Bus Queues
Caracteristica |
Windows Azure Queues |
Service Bus Queues |
Garantía de orden |
No |
Sí, FIFO (a través del uso de las sesiones de los mensajes) |
Garantía de entrega |
Al menos uno |
Al menos uno A lo máximo uno |
Soporte de transacciones |
No |
Sí (a través del uso del sistema local de transacciones) |
Comportamiento a la hora de recibir mensajes |
No bloqueante (se completa de manera inmediata si no se encuentra un mensaje) |
Bloqueante con y sin timeout No bloqueante (sólo disponible a través de la API de .NET) |
Modo de recibir los mensajes |
Peek & LEase |
Peek & Lock Receive & Delete |
Modo de acceso exclusivo |
Basado en cesiones de mensajes |
Basado en bloqueos |
Duración del bloqueo o de la cesión |
30 segundos (predeterminado) 7 días (máximo) |
60 segundos (predeterminado) Se puede renovar el bloqueo usando la API RenewLock |
Granularidad del bloqueo o de la cesión |
A nivel de mensaje (cada mensaje tiene un valor diferente de timeout) |
A nivel de cola (cada cola tiene su valor de bloqueo que se puede renovar usando la API RenewLock) |
Soporte para recibir mensajes en grupos |
Si (esto se hace a través de especificar el número de mensajes que se desean obtener, máximo 32) |
Si |
Soporte para enviar mensajes en grupos |
No |
Si (a través del uso de transacciones o de envío de mensajes en grupo con el cliente) |
Para más información sobre las diferencias entre Windows Azure Storage Queue o Service Bus Queues se puede consultar la documentación online.
Luis Guerrero.
Tecnhical Evangelist Windows Azure