Despues de un tiempo sin postear sobre el tema, vuelvo a programar en Azure. Veamos un ejemplo simple: una aplicación con un web role, un worker role:
Pueden bajar el código que está contenido enmi AjCodeKatas Google project. El código está en:
http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/Azure/AzureNumbers
En la página inicial, podemos ingresar un número a procesar:
Si enviamos el número 10, este datos es enviado a una cola:
protected void btnProcess_Click(object sender, EventArgs e) { int number = Convert.ToInt32(txtNumber.Text); CloudQueueMessage msg = new CloudQueueMessage(number.ToString()); WebRole.NumbersQueue.AddMessage(msg); }El worker role es el encargado de leer esa cola. Decrementa el número, y si el resultado es mayor que cero, lo reinyecta en la cola:
public override void Run() { // This is a sample worker implementation. Replace with your logic. Trace.WriteLine("NumberWorkerRole entry point called", "Information"); CloudStorageAccount account = CloudStorageAccount.FromConfigurationSetting("DataConnectionString"); QueueUtilities qutil = new QueueUtilities(account); CloudQueue queue = qutil.CreateQueueIfNotExists("numbers"); while (true) { CloudQueueMessage msg = queue.GetMessage(); if (msg != null) { int number = Convert.ToInt32(msg.AsString); Trace.WriteLine(string.Format("Processing number: {0}", number), "Information"); number--; if (number > 0) { CloudQueueMessage newmsg = new CloudQueueMessage(number.ToString()); queue.AddMessage(newmsg); } queue.DeleteMessage(msg); } else { Thread.Sleep(10000); Trace.WriteLine("Working", "Information"); } } }Pueden ver la salidad desde el Development Fabric UI:
![]()
Estoy usando un código que estoy armaando, AzureLibrary, para crear una cola:
public CloudQueue CreateQueueIfNotExists(string queuename) { CloudQueueClient queueStorage = this.account.CreateCloudQueueClient(); CloudQueue queue = queueStorage.GetQueueReference(queuename); Trace.WriteLine("Creating queue...", "Information"); Boolean queuecreated = false; while (queuecreated == false) { try { queue.CreateIfNotExist(); queuecreated = true; } catch (StorageClientException e) { if (e.ErrorCode == StorageErrorCode.TransportError) { Trace.TraceError(string.Format("Connect failure! The most likely reason is that the local " + "Development Storage tool is not running or your storage account configuration is incorrect. " + "Message: '{0}'", e.Message)); System.Threading.Thread.Sleep(5000); } else { throw; } } } return queue; }Tome esa forma de crear una cola de código que venía en los ejemplos de Azure SDK.
Próximos pasos para explorar:
– Agregar instrumentación al worker role
– Usar más instancias, e ir generando más mensajes en el proceso– Agregar soporte de múltiples threads dentro del worker role
– Algún ejemplo usando Azure Storage (table, blob)
Y algunos pasos más grandes:
– Inyectar y ejecutar código AjSharp (o AjTalk) en los worker roles
– Implementar una aplicación distribuida (algoritmo genético distribuido, cálculo de fractar o ray tracer, web crawler, simulación con Montecarlo, etc…)Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com