Applications WCF évolutives utilisant la mise en cache distribuée

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é.

  • Les données d'application sont de loin l'utilisation de données la plus importante dans un service WCF, et leur stockage et leur accès constituent un goulot d'étranglement majeur en raison de la latence qui est un sous-produit de l'accès aux données relationnelles.
  • Les environnements avec des sources de données hautement distribuées et disparates représentent le plus grand défi pour atteindre les objectifs de performance de la SOA. Bien que le niveau d'application puisse bien évoluer, l'une des principales préoccupations qui subsistent dans une architecture orientée services (SOA) est la performance des services de données participants.
  • La couche de données ne peut pas évoluer de manière linéaire en termes de capacité de traitement des transactions, ce qui peut entraîner des retards considérables dans le temps de réponse global.
  • De plus, un service SOA dépend d'autres services, qui peuvent ne pas être disponibles localement, de sorte qu'un appel WAN vers un autre service peut devenir un autre goulot d'étranglement.
  • De plus, si la SOA est utilisée dans la mise en œuvre d'une couche de virtualisation des données, les performances des services de données sont d'une importance capitale, auquel cas les performances de l'application sont directement proportionnelles au temps nécessaire pour récupérer les données sous-jacentes. Les services de données peuvent accéder à la fois à des données relationnelles et non relationnelles, souvent réparties sur plusieurs centres de données répartis géographiquement, ce qui peut entraîner une latence de réponse, ce qui entrave les performances globales de l'application.

Cache distribué (NCache) pour l'évolutivité du service

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.

Comment NCache la mise en cache distribuée peut réduire la pression sur la source de données
Figure 1 : Comment NCache la mise en cache distribuée peut réduire la pression sur la source de données

Mise en cache des données d'application

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 :

  • Le cache distribué peut évoluer en fonction de l'architecture qu'il utilise.
  • Il maintient les choses réparties sur plusieurs serveurs et donne toujours à votre application SOA une vue logique de sorte que vous pensez qu'il ne s'agit que d'un cache. Mais le cache vit en fait sur plusieurs serveurs et c'est ce qui permet au cache de vraiment évoluer.
  • Si vous utilisez la mise en cache distribuée comme NCache entre la couche de service et la base de données, vous améliorerez considérablement les performances et l'évolutivité de la couche de service, car cela vous évitera un grand nombre de déplacements de base de données chronophages.

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;
    }
  }
}
Figure 2 - Service WCF utilisant NCache - Mise en cache distribuée

Fonctionnalités importantes de mise en cache

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.

Expiration des données en cache

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.

Synchronisation du cache avec une base de données

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.

Gestion des relations de données dans le cache

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.

Conclusion

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.

© Copyright Alachisoft 2002 - . Tous droits réservés. NCache est une marque déposée de Diyatech Corp.