Enterprise Video: Local cache para Azure Media Services #azure

Introducción

Una de las cargas de trabajo que hace mucho sentido mover a la nube es el Streaming de videos en demanda desde la nube. Las razones son múltiples, costos, elasticidad, etc.

En el contexto de Enterprise video, por ejemplo cuando el presidente de una empresa le habla a sus colaboradores, donde todos los consumidores del video vendrán de la red interna hace sentido utilizar un nodo de cache local para ahorrar tráfico sobre internet.

En este post, vamos a configurar un nodo de cache de contenidos VOD que están siendo servidos desde un Origin Server de Azure Media Services, como se muestra en el siguiente diagrama.

0

Instalación de IIS Application Request Routing

Esta solución se basa en las funcionalidades de IIS Application Request Routing (ARR) de proxy y cache. La idea es que los player usen como dirección de reproducción la URL del servidor IIS local y este obtenga la información desde Media Services la primera vez y luego utilice una copia almacenada en el cache local.

Más información de ARR la pueden ver en Application Request Routing

La instalación de ARR es muy simple utilizando Web Platform Installer, solo buscar ARR 3.0, lo seleccionas y luego instalar como se muestra en la imagen 2.

2

Una vez instalado ARR, utilizando IIS Manager creamos una nueva Farm. La farm es la definición de un Web Front que está compuesto por varios nodos.

3

Lo primero que se debe definir es el nombre de la Farm.

4

Luego debemos agregar los servidores de origen del contenido, en nuestro caso es el Origin Server de Azure Media Services. En el portal, podemos leer la URL del servidor de origen. En este ejemplo es jpbutler.origin.mediaservices.windows.net como se muestar en la siguiente captura de pantalla.

5

Agregamos el servidor de origen con las opciones por defecto.

7

Una vez terminada la creación del FARM se deben crear las reglas URL rewrite, las cuales en este caso son las reglas por defecto por lo que podemos aceptar la auto creación de las mismas.

8

Prueba de la configuración de ARR Web Farm

Una vez realizada la configuración de la FARM en ARR podemos realizar la siguiente prueba.

Primero vamos a consumir el video desde Media services, que sería la forma en que normalmente se consume cuando no hay un proxy intermedio. Para esto vamos a utilizar el player Silverligth llamado Vertigo que nos permite ver video utilizando Smooth Streaming. Este player nos permite escribir la URL del archivo manifiesto del video y verlo.

La URL de vertigo player es http://player.smooth.vertigo.com/ y la URL del archivo manifiesto en el servidor de origen es http://jpbutler.origin.mediaservices.windows.net/626e3f3a-bfc2-48fc-9077-b7fa826d15ca/dfxptest.ism/Manifest

La siguiente captura de pantalla nos muestra cómo se ve el video en este primer caso.

9

Una vez comprobado que el video se ve directamente desde Media Services, vamos a probar que podemos consumirlo desde el proxy intermedio, implementado con IIS ARR. Para esto vamos a utilizar la URL del servidor IIS http://smoothcache.cloudapp.net/626e3f3a-bfc2-48fc-9077-b7fa826d15ca/dfxptest.ism/Manifest

En mi caso, creé un servidor IIS en una máquina virtual de Azure. En un escenario real, este servidor sería un IIS que está instalado en la red local del cliente.

En esta segunda captura de pantalla podemos ver cómo el mismo video se consume desde el servidor IIS con ARR, el player no distingue que el contenido viene desde Media Services sino que para él el servidor de origen es el IIS ARR.

10

Configuración de IIS ARR Cache

Hasta este momento hemos utilizado la capacidad de proxy de IIS ARR cuando generamos una Web FARM. Esto es muy útil en muchos escenarios, ahora para resolver el problema de consumo de ancho de banda internet de los empleados de una corporación que quieren ver el video del discurso del presidente, necesitamos agregar la capacidad de hacer Cache local.

Esto quiere decir que el proxy cuando obtenga un chunck del video, además de enviarlo al player para que lo proyecte guarde ese trozo de información de modo que el siguiente cliente que necesite esa parte del video pueda consumirlo desde el Cache local y no desde el origen del video en Media Services.

Para configurar el cache de ARR debemos ir a ARR a nivel de servidor y abrir las Features como se muestra en la siguiente pantalla de IIS Manager.

11

Aquí se deben agregar los discos de cache. Estos discos son el storage donde se almancena la información del cache. Se utilizan dos discos, uno primario y el otro secundario.

En nuestro ejemplo, utilizo los dos discos locales del servidor. El disco primario será D:\Cache y el secundario C:\cache. En una solución de producción es recomendable utilizar un storage externo y rápido. La creación de estos dos discos se muestra en las dos siguientes pantallas de IIS Manager.

 1213

Una vez agregado los discos de cache, debemos activarlo en el nivel de Web Farm. Con esto, de ahora en adelante además de actuar como Proxy será también un cache local.

Esto lo hacemos abriendo las propiedades del icono cache en la Web Farm.

14

Los datos de configuración del cache se muestran en la siguiente captura de pantalla. La idea es que los objetos duren en memoria 5 segundos y luego se guardan en disco. Si la Web Farm recibe una nueva petición para ese objeto lo leerá desde el disco y lo mantendrá nuevamente en memoria por 5 segundos

15

Prueba de la configuración de IIS ARR Cache

Una vez terminada la configuración podemos probar nuevamente el consumo de los videos desde el servidor IIS ARR, y validar cómo se van almacenando los chunck del video en el disco local del cache.

La prueba que se hace es consumir con dos clientes diferentes el video, en este caso utilizando Vertigo Player en Chrome y FireFox. Las siguientes dos imágenes muestran los videos en los clientes ya mencionados.

17

18

Por último, podemos ver la utilización del disco en IIS Manager y en el disco primario. La siguiente imagen muestra que el 0.35% de la capacidad del disco primario utilizada por la copia local de este video.

Además, podemos ver que en el disco que se ha creado una estructura de archivos que sigue la jerarquía de servidor de origine, ruta y elemento. Por ejemplo, los fragmentos del video en diferentes calidades ya están almacenado en el cache.

19

Conclusiones

En este ejercicio hemos realizado la instalación y configuración de un Web Farm con funcionalidades de Proxy y Cache. Esto nos permitió mostrar solucionar el problema que se presenta en el contexto de soluciones de Enterprise Videos, donde se requiere hacer almacenamiento local de los contenidos para ahorrar ancho de banda de internet cuando los diferentes empleados ven los videos corporativos.

Esta es una implementación basada en IIS ARR, que es un servicio flexible y configurable en diferentes escenarios. Por ejemplo, si se requiere una implementación en alta disponibilidad es posible utilizando a lo menos 3 servidores IIS ARR que actúan como uno.

Articulos relacionados

WAMS VOD Butler: workflow de publicación de video en demanda

Introducción

Desde hace un tiempo muchas cargas de trabajo, de diferentes tipos, se están moviendo a la nube por diferentes motivos. Algunos buscan mejor desempeño, mejorar la disponibilidad y confiabilidad de las soluciones, disminuir costos, etcétera. Dentro de las cargas de trabajo que naturalmente están buscando moverse a la nube tenemos las soluciones de medios de comunicación.

Las necesidades de IT para las soluciones de medios podemos describirlas como:

  • Requerimientos exponenciales en recursos
  • Respuestas agiles para los proyectos de producción
  • Motivados por reducción de costos

Para estos tres pilares de necesidades de las soluciones de medios podemos encontrar respuesta en las soluciones de computación en la nube y específicamente en Azure Media Services (WAMS).

WAMS ofrece la flexibilidad, escalabilidad y confiabilidad de una plataforma de nube y el manejo de experiencia de medios de alta calidad para audiencias globales. WAMS ofrece solución para ingestión, codificación, conversión de formatos, protección del contenido y trasmisión de video en vivo o bajo demanda para múltiples plataformas y dispositivos.

En WAMS usted puede construir un workflows de inicio a fin completamente en la nube. Desde la subida hasta la distribución del contenido, para ello WAMS provee un amplio rango de componentes listos para usar, pre construidos o de terceros que se pueden combinar para satisfacer su necesidad especifica.

WAMS VOD Butler código de ejemplo

En el contexto de una solución que utilice WAMS para video en demanda (VOD) el cliente tiene que implementar el workflow de publicación utilizando por ejemplo el SDK de punto NET. Esto es una muy flexible manera de implementar un workflow ya que da la libertad a los desarrolladores de codificar de acuerdo a las necesidades específicas de cada caso. Por otra parte, existen clientes que tienen la necesidad de un flujo de publicación VOD muy simple para los que no necesariamente hace sentido desarrollar código a la medida, por ejemplo un flujo como se muestra a continuación.

a1Para este tipo de escenario fue creado el código de ejemplo/Framework llamado WAMS VOD Butler, que implementa un flujo de procesamiento directo desde un video MP4 hasta la publicación del mismo ya codificado para ser consumido por los diferentes clientes. Para iniciar el proceso se debe subir el video a un contenedor del almacenamiento de Azure y eso gatilla el inicio del trabajo. El proceso se muestra en el siguiente diagrama de secuencia

b1

Una de las características más interesantes que tiene Butler es que los formatos de video de salida son configurables, por lo cual simplemente cambiando la configuración usted puede obtener diferentes formatos de video y empaquetamiento al final del proceso.

En este artículo vamos a implementar WAMS VOD Butler y codificar un video MP4 en formato multi bit rate y lo empaquetaremos de manera dinámica para que pueda ser consumido mediante HTTP Adaptative streaming con diferentes protocolos, por ejemplo HLS para dispositivos IOS y Smooth Streaming para plataforma Windows.

Despliegue de Butler

Como primer paso debemos hacer el despliegue de los componentes de Butler en Microsoft Azure. Butler es un servicio construido íntegramente sobre los servicios de Cloud Service y Storage. El siguiente diagrama muestra los componentes de Butler.

c1

Para realizar el despliegue debemos realizar dos tareas:

  • Crear una instancia de WAMS en Azure.

Para esto se puede ver el articulo How to Create a Media Services Account en http://azure.microsoft.com/en-us/documentation/articles/media-services-create-account/

  • Crear los elementos en el servicio de Storage.

Para simplificar la creación de estos elementos y la configuración básica de Butler podemos usar el siguiente PowerShell Script

Pare ejecutarlo debemos definir los siguientes parámetros:

  1. azureSubscritionName: Nombre de la subscripción en que vamos a hacer despliegue de Bulter y dondé se encuentra Azure Media Services.
  2. wamsAcountName: Nombre de la cuenta de Azure Media Services.
  3. wamsAcountKey: Llave de la cuenta de Azure Media Services.
  4. butlerStorageAccountName: Nombre de la cuenta de almacenamiento de Media Services.
  5. butlerContainerStageName: Nombre del contenedor donde se subirán los archivos MP4 para iniciar el proceso.

El script se ejecuta como se muestra a continuación:

CreateButlerStorageElements -azureSubscritionName ‘jpgarcia69 Windows Azure MSDN – Visual Studio Ultimate’ -butlerContainerStageName ‘stage’ -wamsAcountKey ‘[your Wams Account Key]’ -wamsAcountName ‘testpoweshell’ -butlerStorageAccountName ‘testpowershellstorage’

  • Hacer el despliegue del Worker Role en el servicio Cloud Service.

Una vez que se cuenta con todas los elementos creados en el almacenamiento de Azure debemos hacer deploy del Worker Role que implementa WAMS VOD Butler.

Butler al ser un ejemplo de código abierto está publicado en GITHUB y usted puede descargarlo directamente desde https://github.com/liarjo/WAMSVODButler y abrirlo con Visual Studio para hacer deploy. Lo único que debe hacer es actualizar dos parámetros de configuración:

  1. strConnConfig
  2. Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString

En ambos parámetros usted debe colocar la cadena de conexión a la cuenta de almacenamiento de WAMS. Una vez actualizada la configuración se hace deploy. Si no conoce cómo hacer deploy con Visual Studio puede ver el articulo Developing and Deploying Microsoft Azure Cloud Services Using Visual Studio en la liga http://msdn.microsoft.com/en-us/magazine/jj618299.aspx

Pruebas de funcionamiento VOD

Una vez terminado el despliegue y configuración de WAMS VOD Butler podemos probar su funcionamiento. Primero debemos subir un video MP4 al contenedor de Staging en la cuenta de almacenamiento. La imagen muestra el video en el contenedor.

d1

Una vez que el video está en el contendor, debemos espera a que Butler detecte el nuevo archivo. Cuando lo hace, crea un Asset con el video original, el que está marcado con rojo, y otro que es el video codificado. En este caso en multiBitrate.

e1

Luego nos movemos a ver la lista de JOBS de WAMS y podemos ver que el trabajo de codificación va avanzando.

f1

Una vez que la codificación termina, podemos volver al contenido y ver que ahora solo tenemos un Asset. La razón de esto es que después de codificar el video original ya no se utiliza y por eso por eso Butler lo borró. Por otra parte podemos ver que el nuevo Asset está ya publicado, lo que significa que está listo para ser consumido.

g1

Para probar el video podemos hacer click en el botón Play de Media Services y vemos con el player por defecto el video codificado, como se muestra en la siguiente imagen.

h1

Prueba de Adaptative Streaming

Ahora vamos a probar la característica de WAMS llamada Dynamic Package, como se muestra en el siguiente diagrama. Más información en http://msdn.microsoft.com/en-us/library/jj889436.aspx

i1

 

Para probar Dynamic Package necesitamos configurar a lo menos una instancia reservada en el servidor de origen de Media Services. Para nuestro ejemplo necesita solo una instancia reservada, cómo hacerlo puede verse en el artículo How to Scale a Media Service en http://azure.microsoft.com/en-us/documentation/articles/media-services-how-to-scale/

Una vez que tenemos al menos una instancia reservada del servidor de origen tenemos que leer desde la cola de notificaciones de Butler. Está cola se llama wamsbutlerallencodefinish y está en la cuenta de almacenamiento de WAMS. Utilizando alguna de las herramientas para el servicio de almacenamiento de Azure podemos ver el contenido del mensaje de notificación y copiar la URL que contiene el manifiesto, como muestra la siguiente imagen.

En este caso de ejemplo la URL es http://testpoweshell.origin.mediaservices.windows.net/f2def825-e100-4490-81d3-3904c065d8bc/BigBuckBunny_400.ism/manifest

Con esta URL podemos usar un player que soporte Smooth Streaming para ver nuestro video usando adaptative streming. Existen multiples opciones para esto, se puede usar para probar el Player llamado vértigo que se encuentra en la liga http://player.smooth.vertigo.com/.

Copiamos en el cuadro de texto llamado Manifest URL la url de nuestro manifiesto y apretamos el botón Set Source and Play y ya podemos ver nuestro video con este modelo de entrega adaptativo como se muestra en la siguiente imagen.

j1

Próximos pasos

Los próximos pasos con WAMS VOD Butler son comenzar a manejar la configuración para poder obtener formatos de videos que calcen con las necesidades específicas de su sistema.

Links relacionados

  1. Windows Azure Tech Series: Media Services 
  2. Windows Azure Media Services: Publicar videos para IOS y Windows Phone #azure

Laboratorios del curso Windows Azure Technical Training Santiago #windowsazure

Durante el curso Windows Azure Technical Training Santiago Chile, entrenamiento fuertemente orientado a la práctica, se realizaron 10 ejercicios para los desarrolladores y 12 ejercicios para los IT pro.
Los recursos utilizados para estos ejercicios son de libre acceso, por lo cual cualquier persona puede realizarlos si tiene una cuenta de Windows Azure. Si no la tiene, puede abrir una trial por 30 días de manera gratuita.

Para los desarrolladores de software, la batería de ejercicios es la siguiente:

1. Azure Web Sites
https://rgodinhodemo.blob.core.windows.net/hol/ASPNETAzureWebSites.zip

2. SQL Server on Azure Virtual Machines
https://rgodinhodemo.blob.core.windows.net/hol/ConnectingApplicationsVNet.zip

3. Windows Azure Mobile Services
http://www.windowsazure.com/en-us/documentation/articles/mobile-services-html-get-started/Windows

4. Windows Azure Media Services
http://jpgarcia.cl/2013/04/02/windows-azure-media-services-publicar-videos-para-ios-y-windows-phone-azure/

5. Windows Azure Active Directory
http://www.asp.net/identity/overview/getting-started/developing-aspnet-apps-with-windows-azure-active-directory
http://blogs.technet.com/b/ad/archive/2013/06/26/improved-windows-azure-active-directory-integration-with-asp-net-amp-visual-studio.aspx

6. Windows Azure SQL Database
https://rgodinhodemo.blob.core.windows.net/hol/IntroSQLDatabase.zip

7. Windows Azure Diagnostic & Patterns
http://www.windowsazure.com/en-us/manage/services/web-sites/choose-web-app-service/Troubleshooting
http://msdn.microsoft.com/en-us/library/windowsazure/hh771389

8. Windows Azure Service Bus
http://www.windowsazure.com/en-us/develop/net/how-to-guides/service-bus-queues/
http://www.windowsazure.com/en-us/develop/net/how-to-guides/service-bus-relay/

9. Windows Azure Cloud Services
http://msdn.microsoft.com/en-us/library/ff687127.aspx

10. Windows Azure Storage
http://www.windowsazure.com/en-us/develop/net/tutorials/multi-tier-web-site/1-overview/

Para los profesionales de infraestructura , la batería de ejercicios es la siguiente:

1. Windows Azure Virtual Machines
https://rgodinhodemo.blob.core.windows.net/hol/IntroToWindowsAzureVirtualMachines.zip

2. SQL Server on Azure Virtual Machines
http://www.windowsazure.com/en-us/documentation/articles/virtual-machines-provision-sql-server/

3. Azure SQL Database
http://www.windowsazure.com/en-us/documentation/articles/sql-database-create-configure/
http://www.windowsazure.com/en-us/documentation/articles/sql-database-deploy/
http://www.windowsazure.com/en-us/documentation/articles/sql-database-manage-windows-azure-SSMS/

4. Windows Azure Virtual Network
http://msdn.microsoft.com/en-us/library/windowsazure/dn133792.aspx
http://jpgarcia.cl/2013/06/07/como-usar-custom-load-balance-y-affinity-en-windows-azure-windowsazure/

5. Sharepoint on Azure Virtual Machines
http://msdn.microsoft.com/en-us/library/windowsazure/dn275959.aspx
http://blogs.technet.com/b/keithmayer/archive/2013/01/07/step-by-step-build-a-free-sharepoint-2013-lab-in-the-cloud-with-windows-azure-31-days-of-servers-in-the-cloud-part-7-of-31.aspx

6. Windows Azure Stoarge
http://michaelwasham.com/windows-azure-powershell-reference-guide/copying-vhds-blobs-between-storage-accounts/
http://msdn.microsoft.com/en-us/library/jj720558%28v=sql.120%29.aspx
https://blogs.technet.com/b/heyscriptingguy/archive/2014/01/24/create-backups-of-virtual-machines-in-windows-azure-by-using-powershell.aspx

7. Windows Azure Managment Services
http://www.windowsazure.com/en-us/manage/services/cloud-services/how-to-scale-a-cloud-service/
http://msdn.microsoft.com/en-us/library/windowsazure/dn306638.aspx
http://www.windowsazure.com/en-us/manage/services/storage/how-to-monitor-a-storage-account/

Windows Azure Technical Community Training CHILE #windowsazure

header

Invitación Windows Azure Technical Community Training

Windows Azure Technical Community Training es un entrenamiento técnico enfocado en entregar a nuestros socios de negocio los conocimientos necesarios para poder enfrentar proyectos Cloud utilizando Windows Azure. El curso está compuesto de dos tracks en paralelo, uno orientado a los desarrolladores de aplicaciones y el otro a los profesionales de infraestructura.  Para ambas audiencias el entrenamiento incluye sesiones teóricas y prácticas en donde se realizarán los ejercicios directamente en Windows Azure.

Este entrenamiento tiene una duración de 3 días para poder darle la profundidad técnica que los socios necesitan para ejecutar proyectos Cloud.

Objetivos del Entrenamiento

 Entregado por arquitectos regionales de Azure del equipo de  Microsoft corporación, los asistentes aprenderán de manera práctica temas como los siguientes:

  • Cómo se puede aprovechar Windows Azure para desarrollar aplicaciones altamente escalables
  • Cómo se pueden desplegar en Windows Azure cargas de trabajo como por ejemplo SQL Server y Sharepoint, aprovechando las ventajas de la nube.
  • Cómo enfrentar los temas de diagnóstico y administración de las aplicaciones en la nube
  • Aprender los patrones y mejores prácticas que se aplican en los proyectos de Nube en Windows Azure

Contenidos del Curso

 Contenidos para Desarrolladores de Aplicaciones

 El track de desarrollo cuenta con los siguientes módulos:

  1. Introducción a Cloud y Windows Azure
  2. Desarrollo de aplicaciones sobre Cloud Services
  3. Desarrollo de Sitos Web modernos y altamente escalables
  4. Uso de Azure SQL Database
  5. Uso de Windows Azure Storage
  6. Diagnóstico y administración de las aplicaciones
  7. Introducción a los otros servicios de Azure
  8. Cloud Computing Patterns & Practices

Agenda para profesionales de infraestructura

El track de infraestructura cuenta con los siguientes módulos

  1. Introducción a Cloud y Windows Azure
  2. Infraestructura como Servicio (IaaS) Máquinas virtuales
  3. Virtual Networking
  4. Cargas de trabajo en Máquinas virtuales ( SQL Server y SharePoint)
  5. Solución de hospedaje para sitios Web
  6. Administración de la nube y ambientes híbridos
  7. Plataforma como servicio (PaaS)

En ambos tracks algunos de  los módulos serán dictados en inglés.

Agenda

Day Begin End Topic CSV Topic SI

4 de Marzo

9:00

10:00

Introduction Introduction

10:00

10:15

Coffee Break Coffee Break

10:15

11:15

Cloud Services Virtual Machines

11:15

12:45

Hand on Lab: Cloud Services Hands On Lab: Virtual Machines

12:45

13:45

Lunch Lunch

13:45

14:45

Websites Virtual Networks

14:45

16:15

Hand on Lab: Websites Hands On Lab: Virtual Network

16:15

16:30

Coffee Break Coffee Break

16:30

17:30

PowerShell

5 de Marzo

9:00

10:00

Storage SQL Server on VMs

10:00

10:15

Coffee Break Coffee Break

10:15

11:45

HOL – Storage Hands on Lab: SQL Server on WMs

11:45

12:45

Virtual Machines SharePoint on VMs

12:45

13:45

Lunch Lunch

13:45

15:15

Hand on Lab – VMs with SQL Hands on Lab: SharePoint on VMs

15:15

16:15

SQL Database Storage

16:15

16:30

Coffee Break Coffee Break

16:30

17:30

HOL – SQL Database Hands on Lab: Storage

6 de Marzo

9:00

10:00

Diagnostics & Patterns System Center

10:00

10:15

Coffee Break Coffee Break

10:15

11:15

Windows Azure Active Directory Azure Management Services

11:15

12:45

HOL – Active Directory Hands on Lab: Azure Managment

12:45

13:45

Lunch

13:45

14:45

Windows Azure Other Services Windows Azure Web Sites

14:45

16:15

HOL – Other Services HOL-Web Sites

16:15

16:30

Coffee Break Coffee Break

16:30

17:30

Close Close

¿A quién está dirigido el entrenamiento?

Este es un entrenamiento técnico que cubre dos audiencias, desarrolladores de aplicaciones y profesionales de infraestructura que estén interesados en aprender de manera práctica los principales conceptos de Windows Azure.

Pre-requisito

Los asistentes al entrenamiento realizarán ejercicios prácticos durante los 3 días del entrenamiento. Para ello, se requiere que cada participante lleve su propio Notebook en el cual realizará los laboratorios.

 Los asistentes al track de desarrollo de software deben traer pre  instalados el siguiente software:

1. Visual Studio 2013 Express para Web o superior

http://www.visualstudio.com/downloads/download-visual-studio-vs

2. Windows Azure SDK Octubre 2013

http://www.windowsazure.com/en-us/downloads/?fb=en-us

Los asistentes al track de infraestructura deben traer pre instalados el siguiente software:

1.  Windows Azure PowerShell

http://www.windowsazure.com/en-us/manage/install-and-configure-windows-powershell/

Cada asistente recibirá una cuenta de Windows Azure gratuita para que pueda desarrollar sus ejercicios y pruebas durante el entrenamiento y posteriormente seguir con ejercicios y pruebas durante 30 días.

¡Regístrate aquí!

Business Rule Engine en Windows Azure #windowsazure

Introducción

Trabajando con un partner mexicano de Guadalajara me encontré con el siguiente requerimiento:

Necesito crear flujos de trabajo que evalúen reglas de negocio que estén fuera del código. Además necesito que estos flujos de trabajo se expongan como servicios para que diferentes sistemas los llamen.

Para los que desarrollan en .NET desde la version 3.5 del framework tienen disponible Workflow Fundation(WF). En este artículo, vamos a desarrollar una solución muy simple para ambos requerimientos utilizando WF4.  La idea es utilizar las capacidades que tiene WF para trabajar con reglas, una de las partes más interesantes de WF. El escenario a desarrollar se muestra en el diagrama 1.

00

La solución final se basa en construir un proyecto Workflow Services, que es la publicación de manera nativa de los WF como servicios usando WCF, los que se publicarán en un Web Role de Windows Azure. Estos workflows pueden evaluar un conjunto de regalas de negocio que están definidas en un archivo XML externos al código. La idea es almacenar el set de regalas de negocio en Windows Azure Blob Storage, de manera que estén disponibles para los Workflow Services. Complementario a lo anterior, vamos a construir un editor y probador de reglas de negocio en una aplicación Windows de consola. Está aplicación nos permite cambiar las reglas en tiempo de ejecución sin necesidad de volver a hacer deploy porque están absolutamente desacopladas del código.

Este articulo está dividido en dos partes, primero vamos a construir una biblioteca que nos facilite el trabajo con reglas y una aplicación de consola para probarla. En la segunda parte vamos a usar la biblioteca desde los Workflows para evaluar reglas en tiempo de ejecución.

Primera parte: Biblioteca y pruebas

Biblioteca de ayuda para usar Reglas de Negocio

Comenzamos por crear una biblioteca de ayuda para utilizar las reglas de negocio de WF desde la aplicación de consola para administración   y  evaluación desde los Wrokflow services en tiempo de ejecución.  Esta biblioteca nos simplifica todo el manejo de las reglas de negocio y está compuesta por la clase BREClient  la que se muestra en el siguiente diagrama.

01

Clase BREClient: Edición de reglas

Lo primero que necesitamos hacer es poder cargar o crear RuleSet. Para ello necesitamos utilizar desde nuestra biblioteca el Blob Storage de Windows Azure. Para ello debemos agregar las librerías clientes de Windows Azure Storage, como se muestra en la siguiente imagen.

3

Como segundo paso agregamos los Assemblies de Windows Worflow Fundation, como se muestra en la siguiente imagen.

4

El método LoadRuleSet de la clase BREClient nos permite cargar o crear un RuleSet desde un archivo XML que se almacena en un contenedor específico del Blob Storage.

///
/// Load or create RulseSet from XMl file RuleSetXmlFile stoarge in RuleSetContainer
        ///
        ///Container´s name
        ///Xml File´s name
        ///
        private RuleSet LoadRuleSet(string RuleSetContainer,string RuleSetXmlFile)
        {
            RuleSet ruleset;
            XmlTextReader reader;
            try
            {
                CloudBlobContainer container = blobClient.GetContainerReference(RuleSetContainer);
                CloudBlockBlob blockBlob = container.GetBlockBlobReference(RuleSetXmlFile);

                if (BlobExist(blockBlob))
                {
                    //Load RuleSet From XML
                    using (var memoryStream = new MemoryStream())
                    {
                        blockBlob.DownloadToStream(memoryStream);
                        memoryStream.Position = 0;
                        reader = new XmlTextReader(memoryStream);
                        WorkflowMarkupSerializer serializer = new WorkflowMarkupSerializer();
                        object results = serializer.Deserialize(reader);
                        ruleset = (RuleSet)results;
                    }
                }
                else
                {
                    //Create New RuleSet
                    ruleset = new RuleSet();
                }
            }
            catch (Exception X)
            {
                //TODO: manage exception
                throw X;
            }
            return ruleset;
        }

El segundo método que necesitamos en la clase BREClient es  SaveRuleSet, que nos permite persistir el RuleSet en un archivo XML en el Blob Storage.

private void SaveRuleSet(string RuleSetContainer,string RuleSetXmlFile, RuleSet ruleset)
        {
            MemoryStream memoryStream = new MemoryStream();
            XmlTextWriter writer = new XmlTextWriter(memoryStream, null);
            WorkflowMarkupSerializer serializer = new WorkflowMarkupSerializer();
            serializer.Serialize(writer, ruleset);
            try
            {
                CloudBlobContainer container = blobClient.GetContainerReference(RuleSetContainer);
                CloudBlockBlob blockBlob = container.GetBlockBlobReference(RuleSetXmlFile);
                memoryStream.Position = 0;
                blockBlob.UploadFromStream(memoryStream);
            }
            catch (Exception)
            {
                //TODO: manage exception
                throw;
            }
            memoryStream = null;
        }

Con estos dos métodos podemos editar las reglas de negocio utilizando la interfaz Rule Set Editor, como se muestra en la siguiente imagen.

02

Este editor es parte del Windows Workflow Fundation, por lo que solo tenemos que invocarla para editar las reglas y luego al presionar OK podemos guardarlas para ser usadas desde diferentes Workflows. El método EditRuleDialog carga las reglas desde el archivo XML, lo edita y luego actualiza con los cambios realizados.

///
/// Load or create Ruleset, Edit with Rule Set Editor and save the changes in XML file.
///
///Type Class used in Rules
///Xml File Blob Container
///XML File´s name
public void EditRuleDialog(Type TargetType, string RuleSetContainer, string RuleSetXmlFile)
{
   RuleSet ruleset = null;
   //load or creat if not exits
   ruleset = this.LoadRuleSet(RuleSetContainer, RuleSetXmlFile);
            RuleSetDialog dialog = new RuleSetDialog(TargetType, null, ruleset);
   DialogResult result = dialog.ShowDialog();
   if (result == DialogResult.OK)
     {
        SaveRuleSet(RuleSetContainer, RuleSetXmlFile, dialog.RuleSet);
      }
}

Con esta implementación se puede editar reglas de negocio absolutamente desacopladas del código de los Workflows. El siguiente código permite editar reglas utilizando la clase BREClient.

static void EDitar()
{
  //conn is Azure Storage´s connection string
   BREClient RuleClient = new BREClient(conn);
  //Target Class to use in Rules
  Person mySubjectEval = new Person();
  string RuleContainer = "demo";
  string RuleXmlFile = "PersonCredit.xml";
  RuleClient.EditRuleDialog(typeof(Person), RuleContainer, RuleXmlFile);
}

Clase BREClient: Evaluación de reglas

Una vez creadas las reglas de negocio y almacenadas en el storage de azure podemos utilizarlas desde diferentes clientes, sin importar si son Workflows o aplicaciones .NET de otra naturaleza, ya que la clase BREClient nos dará acceso al Framework de reglas.

La evaluación de las reglas se hace utilizando  la clase BREClient con el método público RuleExecute donde se carga el Rulset y se evalúan las reglas. El método privado hace la evaluación realmente, mientras que el público le provee el contexto para la ejecución.

///
/// Execute Rule evaluation
///
///Object used in rules
///RuleSet
private void RuleExecute( Object Target, RuleSet ruleset)
{
 try
    {
      RuleValidation validation = new RuleValidation(Target.GetType(), null);
      RuleExecution engine = new RuleExecution(validation, Target);
      ruleset.Execute(engine);
     }
catch (Exception X)
      {
        System.Diagnostics.Trace.WriteLine(X.Message, "Error");
        throw X;
       }
}
///
/// Execute rule evaluation with or without rulset´s cache
///
///Rulset´s blob container
///Rulset´s Xml file
///Object used in rules
///Use Rulset Cache
public void RuleExecute(string RuleSetContainer, string RuleSetXmlFile, Object Target, bool UseRuleCache)
{
   RuleSet ruleset = null;
   if (UseRuleCache)
   {
     string key = string.Format("{0}/{1}", RuleSetContainer, RuleSetXmlFile);
     if (!RuleSetCache.ContainsKey(key))
     {
        ruleset = LoadRuleSet(RuleSetContainer, RuleSetXmlFile);
        RuleSetCache.Add(key, ruleset);
      }
      ruleset = (RuleSet)RuleSetCache[key];
      this.RuleExecute(Target, ruleset);
    }
    else
    {
      ruleset = LoadRuleSet(RuleSetContainer, RuleSetXmlFile);
      this.RuleExecute(Target, ruleset);
   }
}

Para probar la evaluación de las reglamos podemos usar el siguiente método donde se crea el objeto subjectX que es de la clase Person que se utiliza en la regla.

static void Test()
{
  Person subjectX= new Person();
  BREClient RuleClient = new BREClient(conn);
  DateTime timezero = DateTime.Now;
  for (int i = 0; i < 10; i++)
  {
    subjectX.Age = i;
    RuleClient.RuleExecute(RuleContainer, RuleXmlFile, subjectX,false);
    Console.WriteLine(string.Format("Age= {0} rule response {1}", i, subjectX.RuleEval));
   }
   DateTime timeOne = DateTime.Now;
   Console.WriteLine("Total time: " + (timeOne - timezero).TotalSeconds.ToString());
   Console.WriteLine("");
}

La regla que estamos usando es la siguiente: si la propiedad Age es menor que 5, la propiedad RuleEval de la clase Person es verdadero sino falso. Esto se muestra en la siguiente imagen.

02

Al ejecutar la prueba obtenemos la siguiente respuesta, que obedece a la regla definida.

03

El tiempo de ejecución es alrededor de 0.95 segundos por llamada. Esto ocurre porque en cada evaluación accede al archivo XML que está en el Blob Storage. En el caso en que las reglas no cambian en tiempo real podemos optimizar los tiempos utilizando un cache local para los RulSet. El siguiente método optimiza las llamada a las mismas reglas pero usando cache.

static void TestCache()
{
  Person subjectX = new Person();
  BREClient RuleClient = new BREClient(conn);
  DateTime timezero = DateTime.Now;
  for (int i = 0; i < 10; i++)
    {
      subjectX.Age = i;
      RuleClient.RuleExecute(RuleContainer, RuleXmlFile, subjectX,true);
      Console.WriteLine(string.Format("Age= {0} rule response {1}", i, subjectX.RuleEval));
     }
     DateTime timeOne = DateTime.Now;
     Console.WriteLine("Total time: " + (timeOne - timezero).TotalSeconds.ToString());
     Console.WriteLine("");
}

Las respuestas a esta segunda llamada toman sólo 0,1,83 segundos por regla porque sólo hace una lectura al blob storage y alamacena en un Hashtable el objeto RuleSet por lo que todas las otras evaluaciones la realiza con el objeto ya guardado en memoria.

04

Segunda parte: Workflows como Servicios

En esta segunda parte vamos a desarrollar el proyecto de Workflow Services, donde implementaremos los Workflows que utilizaran la clase BREClient para evaluar las reglas de negocio alacenadas en el archivo XML en Azure Blob Storage.

Workflow EvalPerson

El primer workflow a desarrollar es la evaluación de un sujeto basado en la clase Person. El servicio recibe como parámetro una instancia de Person y lo regresa al cliente después de hacer la evaluación como se muestra en la siguiente imagen.

05

El mensaje de entrada se llama data y el del tipo HelperBRE.SampleSubject.Person para poder aplicarle las mismas reglas que utilizamos en la primera parte del artículo, con la aplicación de consola que crea, edita y graba reglas de negocio. El WSDL que expone el servicio se muestra en la siguiente imagen.

06

Ahora, si miramos el contenido de la actividad Flow: Rule Evaluation podemos ver que está compuesta por una actividad del tipo InvokeMethod llamada “Rule Eval”, Decision y Assign llamada “SalaryPlus”. Estas actividades y sus conectores se muestran en la siguiente imagen. Además de las actividades, se deben declarar las variables que se utilizaran en el workflow, las que aparecen en la tabla de variables.

07

La actividad “Rule Eval” requiere que se declare el método que se llamará y también que parámetros se utilizarán. Aquí es donde utilizamos el objeto BREClientWF4 de la clase BRClient para invocar la evaluación de las reglas de la misma forma que utilizamos en la primera parte del artículo. Como parámetros de la llamada usamos las variables ya definidas RuleContainer, RuleXmlFile, data y el valor true. La configuración de “Rule Eval” se muestra en la siguiente imagen.

08

Una vez realizada la evaluación de las reglas podemos tomar una decisión basados en la propiedad data.RuleEval, valor que fue fijado en la evaluación de la regla de negocio. Si el valor es verdadero, vamos a modificar el valor de la propiedad data.Salary aumentándolo en 10%.

Por último, después de ejecutar el Flowchart respondemos al cliente que nos ha llamado, regresándole el mismo objeto data pero con los valores modificados en base a la evaluación de las reglas y la asignación de valor en el workflow.

Para probar este workflow ejecutamos el proyecto, que es un Web Role, y podemos utilizar el programa de pruebas WCF Test Cient. Como primera prueba llamamos al Workflows con los valores 0, False y 100 y nos responde 0, True y 100. Esto es porque la evaluacion de la regla de negocio dio True entonces el workflow le aumentó 10% el salario al sujeto evaluado como se muestra en la siguiente imagen.

09

Como segunda prueba ejecutamos el workflow con los valores 10, False y 100 y nos regresa 10, False y  100. Esto es porque la regla de negocio respondió False y no tuvo entonces aumento en el workflow como se muestra en la siguiente imagen.

010

Con estas dos pruebas comprobamos que nuestro Workflow con invocación a las reglas de negocio funciona perfectamente por lo que podemos crear un cliente que nos permite utilizarlo. El siguiente código, muestra como iniciar el Workflow utilizando código.  La idea de este método de prueba es que hace 10 evaluaciones y nos muestra su resultado por pantalla, cada evaluación es una llamada al servicio que expone el Workflow.

static void TestWF4WFC()
{
  Person subjectX = new Person();
  srvEvalPersona.ServiceClient proxy = new srvEvalPersona.ServiceClient();
  DateTime timezero = DateTime.Now;
  for (int i = 0; i < 10; i++)
    {
     subjectX.Age = i;
     subjectX.Salary = 100;
     proxy.EvalPersona(ref subjectX);
     Console.WriteLine(string.Format("Age= {0} rule response {1} and Salary={2}", i,subjectX.RuleEval,subjectX.Salary));
     }
     DateTime timeOne = DateTime.Now;
     Console.WriteLine("Total time: " + (timeOne - timezero).TotalSeconds.ToString());
     Console.WriteLine("");
}

La respuesta a cada llamada se muestra en la siguiente imagen, los resultados son coherente con la regla definida. Ahora, el tiempo de ejecución de las 10 evaluaciones toma 10.49 segundo porque estamos haciendo 10 llamadas al servicio y cada llamada a su vez carga el RulSet desde el storage.

011

Podemos optimizar esto, construyendo un Workflow que haga la evaluación de varias personas en una sola llamada y usar RuleSet Cache para que sea lo más rápido posible la evaluación. Este nuevo workflow tiene la siguiente estructura: recepción de la petición, ciclo ForEach donde se evalúa cada persona y respuesta al cliente como se muestra en la siguiente imagen.

A diferencia del primer workflow, este recibe como mensaje un objeto del tipo Persons[], es decir un arreglo de personas a evaluar.

012

El archivo WSDL que describe a este nuevo Workflow se muestra en la siguiente imagen.

013

A diferencia del primer workfow, aquí tenemos que evaluar a todas las personas que vienen en la llamada por lo que utilizamos la actividad ForEach, donde cada persona a evaluar es asignada al objeto subject. Luego en cada iteración se hace el llamado a RuleExecute usando el objeto BREClientWF4 del tipo BREClient y aplicando o no el cambio de salario dependiendo de resultado de la evaluación de la regla de negocio, como se muestra en la siguiente imagen.

014

Para poder probar este nuevo workflow, utilizamos el código que se muestra a continuación. En este procedimiento creamos un arreglo de 10 personas y les asígnanos el mismo salario pero diferente edad a casa uno.

static void TestWF4WFC_Bacth()
{
  Person[] subjectXs = new Person[10];
  for (int i = 0; i < 10; i++)
  {
     subjectXs[i] = new Person();
     subjectXs[i].Age = i;
     subjectXs[i].Salary = 100;
  }
  srvEvalPersonaBatch.ServiceClient proxy = new srvEvalPersonaBatch.ServiceClient();
  DateTime timezero = DateTime.Now;
  //execute
  proxy.EvalPersonaBatch(ref subjectXs);
  foreach (var subject in subjectXs)
  {
    Console.WriteLine(string.Format("Age= {0} rule response {1} and Salary={2}", subject.Age, subject.RuleEval, subject.Salary));
  }
  DateTime timeOne = DateTime.Now;
  Console.WriteLine("Total time: " + (timeOne - timezero).TotalSeconds.ToString());
  Console.WriteLine("");
}

Luego hacemos solo una llamada al servicio y obtenemos la respuesta. Con la respuesta recorremos el arreglo e imprimimos el resultado de la evaluación de cada cliente. En la siguiente imagen podemos ver el resultado de ejecutar la prueba obteniendo resultados coherentes con las regla de negocio y en un tiempo de 0.069 segundos por regla.

015

Conclusiones

En este artículo hemos visto cómo podemos utilizar el motor de reglas de Windows Workflow Fundation desde una aplicación de consola. Esto lo hemos hecho utilizando una clase de apoyo llamada BREClient. Un punto importante a tener en cuenta es el uso de cache local para el RuleSet ya que leer en cada evaluación las reglas desde el archivo XML almacenado en Blob Storage hace muy lento las evaluaciones.

En la segunda parte del artículo, utilizando BREClient desde dos workflow diferentes. El primero es una llamada para evaluar a una persona y el segundo para evaluar a grupos de personas, viendo claramente la optimización de la evaluación al hacer solo una llamada por grupo.

Esta es una solución muy simple para el problema propuesto por el partner, pero muy efectiva. Ademas es una solución estándar por lo cual los costos de desarrollo y mantención son más bajos que en un BRE custom.

El código fuente de este artículo está en GIT, en el siguiente link.

016

Presentación Windows Azure VPN Workshop #windowsazure

Aquí esta la presentación que hicimos hoy junto a Alejandro Pachecho en Microsoft Chile sobre Windows Azure VPN.

Links relacionados

Presentación: Using windows azure to develop secure and deploy cloud applications Santiago Chile

vs2013_a

En el contexto del lanzamiento de Visual Studio 2013 presenté las siguientes laminas. En la exposición se muestran los conceptos básicos de Windows Azure y las herramientas que VS2013 trae para facilitar el desarrollo de aplicaciones en la Nube.

En las siguientes ligas se pueden hacer tutoriales parecidos a las demostraciones  que vimos en la presentación.

  1. Escenario de DEV/TES de Sharepoint en Azure VM
  2. Creación de Web Sites en Azure
  3. Debugging remoto con Visual Studio 2013
  4. Crear una aplicación Windows Phone 8 con BackEnd en Azure Mobile Services
  5. Publicar servicios internos en Azure Service Bus Relay