Windows Azure Scheduler Preview: Creando jobs en la nube

El pasado 12 de Diciembre Scott Guthrie anunció en su blog la salida de Windows Azure Scheduler como uno de los servicios dentro del portal, en estado Preview. En la mayoría de las conversaciones que he tenido sobre arquitecturas en la nube, siempre hay un tema recurrente: “Necesitamos lanzar tareas nocturas”, “¿No hay alguna forma de limpiar el storage cada X tiempo?”, etcétera. Pues justamente esto es lo que necesitamos 🙂

Windows Azure Scheduler nos permite lanzar acciones, como hacer llamadas HTTP(S) o añadir mensajes en una queue de Windows Azure Storage (no de Service Bus). La forma de hacerlo es a través de jobs donde podemos indicarle qué, cuándo y cuánto.

Habilitar Windows Azure Scheduler Preview

Al ser un servicio todavía en fase de desarrollo, lo primero que debemos hacer es solicitar el acceso a través de la página de Windows Azure Previews. Una vez confirmada la activación, tendremos un nuevo apartado en nuestro portal:

menu scheduler

Jobs

Para crear un job, nos posicionamos en la pestaña del servicio y pulsamos el botón New.

Scheduler

En el cuadro de dialogo que aparece, se nos pedirá la ubicación y el nombre de la colección de jobs. Esta colección sólo estará disponible para la zona donde la hayamos creado la primera vez, es decir, al menos por el momento, si queremos utilizar el mismo jobs para una localización diferente será necesario volver a crearlo de nuevo bajo otra colección de jobs.
El siguiente paso es la acción que realizará el job:

Job action Windows Azure Scheduler

En este punto es donde podemos decidir qué tipo de acción queremos realizar. Existen tres tipos a día de hoy:

Incluir un mensaje en una queue de Windows Azure Storage:

job action new queue

Básicamente se trata de un asistente donde le podemos indicar cuál es la cuenta de Windows Azure Storage, el nombre de la queue y un apartado donde introducir el mensaje que queremos enviar. Lo ideal sería utilizar comandos prestablecidos para que el worker que los procese los interprete y ejecute.

Por otro lado, si utilizamos una cuenta ya existente, el asistente varía y debemos generar un token SAS (Shared Access Signature) para poder acceder al servicio:

job action post message

El siguiente paso es definir cuántas veces queremos que se repita: puede ser una única vez (One-time job) o algo prolongado en el tiempo (Recurring job). En este segundo caso, el asistente nos ofrece la siguiente configuración:

Define a Schedule

Una vez aceptados los pasos se comenzará a crear nuestro job. Una vez finalizado el proceso, aparecerá en el apartado job collections:

jobs collections

Para probarlo, lo único que hay que hacer es crearse un extremo, en este caso un worker role, donde permanecemos a la escucha de dicha queue y, en este caso, confirmar que los mensajes introducidos a través del job llegan correctamente:

using System.Diagnostics;
using System.Net;
using System.Runtime.Remoting.Messaging;
using System.Threading;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.Storage;

namespace WorkerRole
{
    public class WorkerRole : RoleEntryPoint
    {
        public override void Run()
        {
            // This is a sample worker implementation. Replace with your logic.
            Trace.TraceInformation("WorkerRole entry point called");

            var account = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageAccount"));
            var queueClient = account.CreateCloudQueueClient();
            var queue = queueClient.GetQueueReference("gisqueue");
            queue.CreateIfNotExists();

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

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

                Thread.Sleep(5000);

            }
        }

        public override bool OnStart()
        {
            // Set the maximum number of concurrent connections
            ServicePointManager.DefaultConnectionLimit = 12;

            // For information on handling configuration changes
            // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.

            return base.OnStart();
        }
    }
}

Los otros dos tipos de acciones, peticiones HTTP y HTTPS, es muy similar: Lo único que debemos indicar es la URL de la acción del servicio web que queremos invocar cada cierto tiempo:

Scheduler job HTTP

Para este caso simplemente he utilizado la plantilla básica de Web API de ASP.NET MVC.

Si seleccionamos nuestra colección en job collections, accederemos a un segundo apartado con las opciones para la misma:

DASHBOARD

gisjobs dashboard

SCALE

gisjobs scale

JOBS

gisjobs jobs

En realidad, es la misma vista que aparece en el apartado principal donde tenemos dos pestañas (job collections y jobs), pero en este caso sólo aparecen los de la colección en cuestión.

HISTORY

gisjobs history

Por otro lado tenemos la posibilidad de ver los detalles de las acciones ya lanzadas. En esta pestaña es necesario filtrar por job.

Por otro lado, tenemos la opción de habilitar/deshabilitar todos los jobs de una colleción en la pestaña job collections o cuando estamos dentro de la colección en cuestión:

Disable all jobs

Espero que sea de utilidad,

¡Saludos!