Azure: una aplicación simple

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
http://twitter.com/ajlopez

This entry was posted in 1389, 9344, 9345. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>