Trabajando con las queues de Windows Azure Storage


Después de haber repasado los blobs y las tablas, llegó el momento de centrarse en las queues :) . Como comenté en el post introductorio sobre qué es Windows Azure Storage, las queues se utilizan para almacenar mensajes con el objetivo de conseguir la comunicación entre distintas aplicaciones que trabajan conjuntamente. Estas colas de mensajes son FIFO (First In First Out) y son de un único sentido.



 Los mensajes están limitados a 8 KB y deben ser serializables como XML.


Accediendo a través del Storage Client


Si bien podemos realizar todas las operaciones a través de REST, esto puede resultar algo tedioso a la hora de trabajar. Por ello, podemos hacer uso de la API en .NET para facilitarnos el trabajo. Es necesario añadir una referencia a Microsoft.Windows.Azure y Microsoft.Windows.Azure.StorageClient.



¿Por dónde empiezo?


Lo primero que debemos hacer es recuperar la cadena de conexión y crear un CloudQueueClient para poder generar o recuperar las queues.

CloudStorageAccount _account = CloudStorageAccount.DevelopmentStorageAccount;
CloudQueueClient _queueClient = _account.CreateCloudQueueClient();

Crear una Queue


Al igual que en los blobs, para crear una queue necesitamos recuperar una referencia a la misma aunque esta no exista. Una vez creada llamaremos al método CreateIfNotExist.

var queue = _queueClient.GetQueueReference(“myqueue”);
queue.CreateIfNotExist();

Listar las queues disponibles


Con ListQueues recuperaremos todas las queues disponibles en esa cuenta.

_queueClient.ListQueues();

Eliminar una Queue


 Cuando eliminamos una queue, es recomendable limpiar primero su contenido y posteriormente eliminarla a través del método Delete, así como anular su referencia a cualquier variable.

queue.Clear();
queue.Delete();
queue = null;

Añadir un mensaje

string message = “Hello world!”;
queue.AddMessage(new CloudQueueMessage(message));

Procesar un mensaje (Polling)

using System.Diagnostics;
using System.Net;
using System.Threading;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.StorageClient;

namespace QueueReader_WorkerRole
{
    public class WorkerRole : RoleEntryPoint
    {
        public override void Run()
        {
            var account = CloudStorageAccount.DevelopmentStorageAccount;
            var queueClient = account.CreateCloudQueueClient();
            var queue = queueClient.GetQueueReference(“myqueue”);
            queue.CreateIfNotExist();

            while (true)
            {
                var message = queue.GetMessage();

                if (message != null)
                {
                    Trace.WriteLine(message.AsString);

                    queue.DeleteMessage(message);
                }
                else
                    Thread.Sleep(2000);
            }
        }

        public override bool OnStart()
        {
            ServicePointManager.DefaultConnectionLimit = 12;

            return base.OnStart();
        }
    }
}


En este proceso, normalmente ejecutado desde un worker role, lo que estamos haciendo es comprobar cada 2 segundos si existe algún mensaje en la queue y de ser así (si el resultado no es nulo) procesarlo. Una vez finalizado el proceso debemos eliminar el mensaje de la queue para que no sea re procesado de nuevo. Cuando un mensaje es recuperado a través de GetMessage permanece invisible durante 30 segundos por defecto, con el objetivo de que no pueda ser recuperado por nadie más. Este tiempo puede ser extensible hasta 2 horas como máximo y, de no ser procesado el message y posteriormente eliminado, volvería a la queue para que fuera recuperado de nuevo por el mismo worker role o cualquiera de sus instancias.


“Ojear” un mensaje (Peek a message)


Existe una alternativa a la hora de conocer el contenido de un mensaje sin la necesidad de sacarlo de la queue. Esta acción es conocida como “peek”, que significa ojear, y puede ser útil para revisar su contenido sin que afecte a su visibilidad. Podemos ojear un mensaje por defecto o indicar a la función PeekMessage el número de mensajes que necesitemos revisar.

var message = queue.PeekMessage();
var messageList = queue.PeekMessage(5);

Connection String


La cadena de conexión sería exactamente la misma que para cualquiera de los otros dos servicios de Windows Azure Storage.

<Setting value=”DefaultEndpointsProtocol=http;AccountName=returngis;
AccountKey=KoJ9maUaV29LDdoajvkA….AUVOdb2ehHw5nN21XI2KF7Q==” />

Espero que sea de utilidad :D


¡Saludos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *