Aplicaciones WCF escalables que utilizan almacenamiento en caché distribuido

Autor: Iqbal Kan

Después de la explosión de las aplicaciones web para acomodar el uso de alto tráfico, la próxima gran ola ha sido la arquitectura orientada a servicios (SOA). SOA ha cambiado el panorama del desarrollo y la integración de aplicaciones. Está destinado a convertirse en una forma estándar de desarrollar aplicaciones extremadamente escalables, y las plataformas de computación en la nube como Windows Azure y Windows Communication Foundation (WCF) representan un gran paso en el avance de SOA hacia el logro de este objetivo. SOA está destinado principalmente a lograr la escalabilidad y soportar tanta carga como se le impone para lograr una mayor agilidad y una mayor productividad.

Sin embargo, una verdadera aplicación SOA debería escalar fácilmente en lo que respecta a la arquitectura de la aplicación. Sin embargo, hay muchos cuellos de botella de rendimiento que deben abordarse para lograr una verdadera escalabilidad.

  • Los datos de la aplicación son, con mucho, el uso de datos más pesado en un servicio WCF, y su almacenamiento y acceso es un cuello de botella de escalabilidad importante debido a la latencia que se presenta como un subproducto del acceso a datos relacionales.
  • Los entornos con orígenes de datos dispares y altamente distribuidos plantean el mayor desafío para alcanzar los objetivos de rendimiento de SOA. Aunque el nivel de la aplicación puede escalar muy bien, una de las principales preocupaciones que quedan en una arquitectura orientada a servicios (SOA) es el rendimiento de los servicios de datos participantes.
  • El nivel de datos no puede escalar de forma lineal en términos de capacidad de manejo de transacciones, lo que puede causar retrasos considerables en el tiempo de respuesta general.
  • Además, un servicio SOA depende de otros servicios, que pueden no estar disponibles localmente, por lo que una llamada WAN a otro servicio puede convertirse en otro cuello de botella.
  • Además, si la SOA se utiliza en la implementación de una capa de virtualización de datos, el rendimiento de los servicios de datos es de vital importancia, en cuyo caso el rendimiento de la aplicación es directamente proporcional al tiempo que lleva recuperar los datos subyacentes. Los servicios de datos pueden estar accediendo a datos relacionales y no relacionales, a menudo distribuidos en varios centros de datos distribuidos geográficamente, lo que puede causar latencia en la respuesta, lo que dificulta el rendimiento general de la aplicación.

Caché distribuida (NCache) para la escalabilidad del servicio

Para reducir la latencia de respuesta de toda la solución, un enfoque integral es utilizar un sistema de almacenamiento en caché de alto rendimiento para usar junto con los servicios de datos o en la capa de virtualización de datos. Los servicios SOA tratan con dos tipos de datos. Uno son los datos del estado del servicio y el otro son los datos del resultado del servicio que residen en la base de datos. Ambos causan cuellos de botella de escalabilidad.

El almacenamiento en caché puede desempeñar un papel muy importante en la mejora de la velocidad para acceder tanto al estado del servicio como a los datos de la aplicación, al tiempo que permite escalar los servicios al mismo tiempo. El almacenamiento en caché logra esto al minimizar la cantidad de tráfico y la latencia entre los servicios que usan el caché y los proveedores de datos subyacentes. La Figura 1 muestra el uso de NCache almacenamiento en caché distribuido para lograr esto.

Cómo NCache el almacenamiento en caché distribuido puede reducir la presión sobre la fuente de datos
Figura 1: Cómo NCache el almacenamiento en caché distribuido puede reducir la presión sobre la fuente de datos

Almacenamiento en caché de datos de la aplicación

Un caché distribuido como NCache se usa para almacenar en caché solo un subconjunto de los datos que se encuentran en la base de datos en función de lo que necesita el servicio WCF en una pequeña ventana de unas pocas horas. Una caché distribuida puede dar a una aplicación SOA un impulso de escalabilidad significativo porque:

  • Distributed Cache puede escalar horizontalmente como resultado de la arquitectura que emplea.
  • Mantiene las cosas distribuidas entre múltiples servidores y aún le da a su aplicación SOA una vista lógica para que piense que es solo un caché. Pero el caché en realidad vive en varios servidores y eso es lo que permite que el caché se escale realmente.
  • Si usa el almacenamiento en caché distribuido como NCache entre la capa de servicio y la base de datos, mejorará drásticamente el rendimiento y la escalabilidad de la capa de servicio, ya que ahorrará una gran cantidad de viajes a la base de datos que consumen mucho tiempo.

La lógica básica a implementar es que, antes de ir a la base de datos, verifique si el caché ya tiene los datos. Si lo hace, tómalo del caché. De lo contrario, vaya a la base de datos para obtener los datos y colóquelos en el caché para la próxima vez. La Figura 2 muestra un ejemplo.

using System.ServiceModel;
using Alachisoft.NCache.Web.Caching;

namespace MyWcfServiceLibrary {
  [ServiceBehavior]
  public class EmployeeService : IEmployeeService {
    static string _sCacheName = "myServiceCache";
    static Cache _sCache = 
      NCache.InitializeCache(_sCacheName);

    public Employee Load(string employeeId) {
// Create a key to lookup in the cache.
      // The key for will be like "Employees:PK:1000".
      string key = "Employee:EmployeeId:" + employeeId;

      Employee employee = (Employee)_sCache[key];
      if (employee == null) {// item not found in the cache. 
        // Therefore, load from database.
        LoadEmployeeFromDb(employee);

        // Now, add to cache for future reference.
       _sCache.Insert(key, employee, null,
          Cache.NoAbsoluteExpiration,
          Cache.NoSlidingExpiration,
          CacheItemPriority.Default);
      }

      // Return a copy of the object since ASP.NET Cache is InProc.
      return employee;
    }
  }
}
Figura 2: uso del servicio WCF NCache - Almacenamiento en caché distribuido

Funciones importantes de almacenamiento en caché

Un diseño de almacenamiento en caché para un servicio debe considerar cuestiones tales como: con qué frecuencia cambian los datos subyacentes, con qué frecuencia deben actualizarse los datos almacenados en caché, si los datos son específicos del usuario o de toda la aplicación, qué mecanismo usar para indicar que el caché necesita actualización, nivel de tolerancia de la aplicación para datos sucios, etc. Por lo tanto, una solución de almacenamiento en caché debe tener las capacidades necesarias para ordenar todos esos requisitos.

Algunas de las características clave en la gestión escalable de datos a través de servicios de datos que utilizan el almacenamiento en caché distribuido se describen a continuación.

Datos almacenados en caché que caducan

Las caducidades le permiten especificar cuánto tiempo deben permanecer los datos en la memoria caché antes de que la memoria caché los elimine automáticamente. Hay dos tipos de vencimientos que puede especificar en NCache: expiración de tiempo absoluto y expiración de tiempo móvil o inactivo.

Si los datos en su caché también existen en la base de datos, sabe que estos datos pueden ser cambiados en la base de datos por otros usuarios o aplicaciones que pueden no tener acceso a su caché. Cuando eso sucede, los datos en su caché se vuelven obsoletos, lo cual no desea. Si puede adivinar cuánto tiempo cree que es seguro que estos datos se mantengan en el caché, puede especificar un vencimiento de tiempo absoluto. Además, la caducidad deslizante puede ser muy útil para las aplicaciones basadas en sesiones en las que almacena sesiones en almacenamiento en caché distribuido.

Sincronización de la caché con una base de datos

La necesidad de sincronizar la base de datos surge porque la base de datos en realidad se comparte entre múltiples aplicaciones, y no todas esas aplicaciones tienen acceso a su caché. Si su aplicación de servicio WCF es la única que actualiza la base de datos y también puede actualizar fácilmente la memoria caché, probablemente no necesite la capacidad de sincronización de la base de datos.

Pero, en un entorno de la vida real, ese no es siempre el caso. Las aplicaciones de terceros actualizan los datos en la base de datos y su caché se vuelve inconsistente con la base de datos. La sincronización de su caché con la base de datos garantiza que la caché siempre esté al tanto de estos cambios en la base de datos y pueda actualizarse en consecuencia.

La sincronización con la base de datos generalmente significa invalidar el elemento almacenado en caché relacionado de la memoria caché, por lo que la próxima vez que su aplicación lo necesite, tendrá que recuperarlo de la base de datos porque la memoria caché no lo tiene.

Gestión de relaciones de datos en la caché

La mayoría de los datos provienen de una base de datos relacional, e incluso si no provienen de una base de datos relacional, son de naturaleza relacional. Por ejemplo, está intentando almacenar en caché un objeto de cliente y un objeto de pedido y ambos objetos están relacionados. Un cliente puede tener varios pedidos.

Cuando tiene estas relaciones, debe poder manejarlas en un caché. Eso significa que el caché debe conocer la relación entre un cliente y un pedido. Si actualiza o elimina el cliente de la memoria caché, es posible que desee que la memoria caché elimine automáticamente el objeto de pedido de la memoria caché. Esto ayuda a mantener la integridad de los datos en muchas situaciones.

Si un caché no puede realizar un seguimiento de estas relaciones, tendrá que hacerlo usted mismo, y eso hace que su aplicación sea más engorrosa y compleja.

Conclusión

Por lo tanto, una aplicación SOA no puede escalar de manera efectiva cuando los datos que utiliza se mantienen en un almacenamiento que no es escalable para transacciones frecuentes. Aquí es donde el almacenamiento en caché distribuido como NCache realmente ayuda En un entorno empresarial, el entorno de aplicaciones basado en SOA no puede escalar verdaderamente sin emplear una verdadera infraestructura de almacenamiento en caché distribuida. Los servidores de bases de datos tradicionales también están mejorando, pero sin el almacenamiento en caché distribuido, las aplicaciones de servicio no pueden satisfacer la creciente demanda de escalabilidad en el complejo entorno de aplicaciones actual.


Escrito por:Iqbal Khan trabaja para Alachisoft , una empresa de software líder que ofrece soluciones de almacenamiento en caché distribuido .NET y Java, mapeo O/R y optimización de almacenamiento de SharePoint. Puedes localizarlo en iqbal@alachisoft.com.

© Copyright Alachisoft 2002 - Todos los derechos reservados. NCache es una marca registrada de Diyatech Corp.