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.
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.
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:
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;
}
}
}
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.
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.
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.
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.
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.