Auteur : Iqbal Khan
Après l'explosion des applications Web pour s'adapter à une utilisation à fort trafic, la prochaine grande vague est devenue l'architecture orientée services (SOA). La SOA a changé le paysage du développement et de l'intégration d'applications. Il est destiné à devenir un moyen standard pour développer des applications extrêmement évolutives, et les plates-formes de cloud computing telles que Windows Azure et Windows Communication Foundation (WCF) représentent un pas de géant dans l'évolution de la SOA vers la réalisation de cet objectif. L'architecture SOA est principalement destinée à atteindre l'évolutivité et à supporter autant de charge que possible pour atteindre une agilité et une productivité améliorées.
Cependant, une véritable application SOA devrait évoluer facilement en ce qui concerne l'architecture de l'application. Cependant, il existe de nombreux goulots d'étranglement de performances qui doivent être résolus pour atteindre une véritable évolutivité.
Pour réduire la latence de réponse de l'ensemble de la solution, une approche globale consiste à utiliser un système de mise en cache hautes performances à utiliser en tandem avec les services de données ou dans la couche de virtualisation des données. Les services SOA traitent deux types de données. L'une concerne les données d'état du service et l'autre les données de résultat de service qui résident dans la base de données. Les deux provoquent des goulots d'étranglement d'évolutivité.
La mise en cache peut jouer un rôle très important dans l'amélioration de la vitesse d'accès à la fois à l'état du service et aux données d'application, tout en permettant de faire évoluer les services en même temps. La mise en cache y parvient en minimisant la quantité de trafic et la latence entre les services qui utilisent le cache et les fournisseurs de données sous-jacents. La figure 1 illustre l'utilisation de NCache mise en cache distribuée pour y parvenir.
Un cache distribué comme NCache est utilisé pour mettre en cache uniquement un sous-ensemble des données qui se trouvent dans la base de données en fonction de ce dont le service WCF a besoin dans une petite fenêtre de quelques heures. Un cache distribué peut améliorer considérablement l'évolutivité d'une application SOA car :
La logique de base à implémenter est que, avant d'aller dans la base de données, vérifiez si le cache contient déjà les données. Si c'est le cas, sortez-le du cache. Sinon, allez dans la base de données pour récupérer les données et mettez-les dans le cache pour la prochaine fois. La figure 2 montre un exemple.
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;
}
}
}
Une conception de mise en cache pour un service doit prendre en compte des problèmes tels que : la fréquence à laquelle les données sous-jacentes changent, la fréquence à laquelle les données mises en cache doivent être mises à jour, si les données sont spécifiques à l'utilisateur ou à l'échelle de l'application, quel mécanisme utiliser pour indiquer que le cache besoin de mise à jour, niveau de tolérance de l'application pour les données sales, etc. Ainsi, une solution de mise en cache doit avoir les capacités requises pour trier toutes ces exigences.
Certaines des fonctionnalités clés de la gestion évolutive des données via des services de données utilisant la mise en cache distribuée sont présentées ci-dessous.
Les expirations vous permettent de spécifier combien de temps les données doivent rester dans le cache avant que le cache ne les supprime automatiquement. Il existe deux types d'expirations que vous pouvez spécifier dans NCache: expiration du temps absolu et expiration du temps glissant ou inactif.
Si les données de votre cache existent également dans la base de données, vous savez que ces données peuvent être modifiées dans la base de données par d'autres utilisateurs ou applications qui n'ont peut-être pas accès à votre cache. Lorsque cela se produit, les données de votre cache deviennent obsolètes, ce que vous ne voulez pas. Si vous êtes en mesure de deviner combien de temps vous pensez qu'il est sûr que ces données soient conservées dans le cache, vous pouvez spécifier une expiration en temps absolu. De plus, l'expiration glissante peut s'avérer très utile pour les applications basées sur des sessions où vous stockez des sessions dans une mise en cache distribuée.
La synchronisation de la base de données est nécessaire car la base de données est réellement partagée entre plusieurs applications et toutes ces applications n'ont pas accès à votre cache. Si votre application de service WCF est la seule à mettre à jour la base de données et qu'elle peut également facilement mettre à jour le cache, vous n'avez probablement pas besoin de la fonctionnalité de synchronisation de la base de données.
Mais, dans un environnement réel, ce n'est pas toujours le cas. Les applications tierces mettent à jour les données dans la base de données et votre cache devient incohérent avec la base de données. La synchronisation de votre cache avec la base de données garantit que le cache est toujours au courant de ces modifications de la base de données et peut se mettre à jour en conséquence.
La synchronisation avec la base de données signifie généralement l'invalidation de l'élément mis en cache associé dans le cache. Ainsi, la prochaine fois que votre application en aura besoin, elle devra le récupérer dans la base de données car le cache ne l'a pas.
La plupart des données proviennent d'une base de données relationnelle, et même si elles ne proviennent pas d'une base de données relationnelle, elles sont de nature relationnelle. Par exemple, vous essayez de mettre en cache un objet client et un objet commande et les deux objets sont liés. Un client peut avoir plusieurs commandes.
Lorsque vous avez ces relations, vous devez être capable de les gérer dans un cache. Cela signifie que le cache doit connaître la relation entre un client et une commande. Si vous mettez à jour ou supprimez le client du cache, vous souhaiterez peut-être que le cache supprime automatiquement l'objet de commande du cache. Cela permet de maintenir l'intégrité des données dans de nombreuses situations.
Si un cache ne peut pas suivre ces relations, vous devrez le faire vous-même, ce qui rend votre application plus lourde et complexe.
Ainsi, une application SOA ne peut pas évoluer efficacement lorsque les données qu'elle utilise sont conservées dans un stockage qui n'est pas évolutif pour les transactions fréquentes. C'est là que la mise en cache distribuée comme NCache aide vraiment. Dans un environnement d'entreprise, l'environnement d'application basé sur SOA ne peut pas vraiment évoluer sans utiliser une véritable infrastructure de mise en cache distribuée. Les serveurs de base de données traditionnels s'améliorent également, mais sans mise en cache distribuée, les applications de service ne peuvent pas répondre à la demande croissante d'évolutivité dans l'environnement d'applications complexes d'aujourd'hui.
Auteur : Iqbal Khan travaille pour Alachisoft , un éditeur de logiciels de premier plan fournissant des solutions de mise en cache distribuée .NET et Java, de mappage O/R et d'optimisation du stockage SharePoint. Vous pouvez le joindre au iqbal@alachisoft.com.