jueves, 28 de junio de 2012

Windows Azure Caching (Preview) I: Introducción y análisis de la caché “Co-located”

imageAzureCachingPreview_Shared

Desde hace ya un tiempo Windows Azure cuenta con un sistema de Cache (o Caching) denominado “Windows Shared Azure Cache”, sin embargo junto a las nuevas carácterísticas, ahora es posible conseguir hacer uso de Caché en nuestras arquitecturas de una manera mucho más fácil e intuitiva.  Eso si, antes de continuar, es conveniente saber que, “Windows Azure Caching (Preview)” no esta soportado aún en entornos de Producción, no obstante, lo estará en breve !

Windows Azure Caching puede reducir el coste e incrementar la escalabilidad de otros almacenes tales como SQL Azure o Azure Storage.

Pero, ¿Cúal es la diferecia entre Windows Shared Azure Cache y Windows Azure Caching (Preview)? Pues bien, la diferencia principal radique en que el primero se trata de un Servicio de Cloud dedicado mientras que el segundo, es configurado dentro de una máquina específica (asignando un porcentaje de recursos de la misma) o configurado dedicando una máquina virtual explicitamente para este propósito. A estos dos tipos se le denomintan Cache “Co-located” y “Dedicated” respectivamente.

Para el primer tipo (Windows Shared Azure Cache) existen laboriatorios On-Line que ejemplifican claramente su uso:

Vemos ahora un poco más en detalle, cuales son los dos tipos de topologías de Azure Caching Preview y las diferencias entre ellas:

En este enlace podemos encontrar más detalle sobre las diferencias en cuanto al uso del API  de Caching (Co-located Caching VS Role-based Caching (Preview)).

A continuación, como configurar el tipo de Caché “Co-Located”:

Creamos un proyecto de tipo “Windows Azure Cloud Service” desde Visual Studio con el nombre “WindowsAzureSharedCache” y elegimos un Role de tipo “Asp.Net MVC 4 Web Role” (Razor) manteniendo el nombre, “MvcWebRole1”:

image

Creamos un Controller y las vistas adecuadas para el tratamiento de la Caché además de incluir una nueva opción de menú “Caching” en “_Layout.cshtml

image

Incluimos en el controller el siguiente código:

   1: [HttpPost]
   2: public ActionResult Save(CacheModels model, string returnUrl)
   3: {
   4:     if (ModelState.IsValid)
   5:     {
   6:         DataCacheFactory cacheFactory = new DataCacheFactory();
   7:         DataCache cache = cacheFactory.GetDefaultCache();
   8:  
   9:         // Save data in Azure Caching
  10:         cache.Put(cacheKey1, model.DataToCache);
  11:  
  12:         if (Url.IsLocalUrl(returnUrl))                
  13:             return Redirect(returnUrl);                
  14:         else                
  15:             return RedirectToAction("Load", "Caching");                
  16:     }            
  17:     return View(model);
  18: }
  19:  
  20: public ActionResult Load()
  21: {
  22:     DataCacheFactory cacheFactory = new DataCacheFactory();
  23:     DataCache cache = cacheFactory.GetDefaultCache();
  24:  
  25:     var result = cache.Get(cacheKey1) as string;
  26:  
  27:     ViewBag.CacheValue = result;
  28:  
  29:     return View();
  30: }

Configuramos las opciones de caché desde las propiedades del proyecto :


image


Para el proyecto ASP.NET MVC, añadir las referencias  a “Windows Azure Caching Preview” usando “Manager NuGet Packages…”.


image


El paso anterior, nos facilitará el camino evitanto tener que añadir manualmente las referencias siguiente:


image


Además de la siguiente configuración del “web.config”:



   1: <configSections>
   2:    <section name="dataCacheClients" type="Microsoft.ApplicationServer.Caching.DataCacheClientsSection, Microsoft.ApplicationServer.Caching.Core" allowLocation="true" allowDefinition="Everywhere" />   
   3:  </configSections>
   4:  <connectionStrings>
   5:  
   6: <dataCacheClients>
   7:    <tracing sinkType="DiagnosticSink" traceLevel="Error" />
   8:    <dataCacheClient name="default">
   9:      <autoDiscover isEnabled="true" identifier="MvcNewAzureStore" />     
  10:      <!--<localCache isEnabled="true" sync="TimeoutBased" objectCount="100000" ttlValue="300" />-->
  11:    </dataCacheClient>
  12:  </dataCacheClients>

Llegado este punto, unicamente es nesario tener en cuenta el parámetro “identifier” de la sección <autoDiscover> anterior, que coincidirá con el nombre del Role de Azure (“MvcWebRole1” según nuestro ejemplo):


image


Para comprobar que estamos haciendo uso de Cache de tipo “Co-located”, hacemos un deploy en Azure habilitando la conexión remota.


image


Una vez hemos realizado el despligue en Azure, podemos observar que el tiempo de despligue es un poco superior, puesto que se lanzan una serie de tareas “Startp tasks”. Puede observarse este mensaje en el ya, “casi” antiguo portal: “System startup tasks are runing…


image


Realizado el despligue, navegamos a la opción de menu “Caching” que ofrece dos páginas: “Save” y “Load”. En la primera, se almacena el dato en cache y en la segunda, se obtiene el dato almacenado se muestra:


image


Como hemos habilitado la conexión remota durante el despliegue, accedemos mediante terminal server a la instancia de nuestro role “MvcWebRole1” y desde allí: Realizamos un restart del site, o un reciclado del pool, o un “IISReset” o, incluso, un reinicio del servicio “World Wide Web Publishing Service”. Tras esta acción, el valor de cache permanece y si navegamos a la página “Load” podemos comprobar que el valor permanece.


image


Adcicionalmente, podemos comprobar la memoria dedicada a la Caché Co-located, cuyo valor ronda los 530MB  iniciales aproximadamente, valor indicado por el proceso “CacheService.exe” y que se corresponde con el 30% establecido en las propiedades del proyecto de tipo Cloud.


image


Hasta aquí el uso de Caché  “Co-Located” con Windows Azure Caching (Preview).  Veremos más adelante, en posts sucesivos el uso de la Caché Dedicada, diferentes opciones y configuración con Azure Caching Preview, uso de cache para Session y  Output Cache, capacity planning y  tamaños de cache según tamaños de VMs y mucho más.


Otras referencias:



¡Ahora no hay motivos para no sacarle partido a nuestra/s instancia/s de Azure. Haz lo mismo con mejor performance y menor coste!


Saludos "and, happy Azure Caching"
Juanlu

Etiquetas: , ,


This page is powered by Blogger. Isn't yours?