2012-06-05 6 views
3

J'écris une application Web à l'aide d'ASP .NET MVC 3. Je souhaite utiliser l'objet MemoryCache mais cela m'inquiète car cela cause des problèmes avec les serveurs Web à charge équilibrée. Quand je google car il semble que ce problème est résolu sur le serveur, c'est-à-dire en utilisant AppFabric. Si une entreprise dispose de serveurs à charge équilibrée, est-il sur eux pour s'assurer qu'ils ont AppFabric ou quelque chose de similaire en cours d'exécution? ou y a-t-il quelque chose que je puisse ou devrais faire en tant que développeur pour cela?Objet MemoryCache et équilibrage de charge

Répondre

4

Tout d'abord, pour ASP.NET, vous devriez regarder le ASP.NET Cache au lieu de MemoryCache. MemoryCache est une API de mise en cache générique introduite dans .NET 4.0 pour fournir un équivalent du cache ASP.NET dans des applications non Web.

Vous avez raison de dire que AppFabric résout le problème de plusieurs serveurs ayant leurs propres instances de données mises en cache, en ce qu'elle fournit un cache logique accessible à partir de tous vos serveurs Web. Avant de sauter sur elle comme la solution à votre problème, il y a une ou deux choses à considérer:

  • Il ne livre pas dans le cadre de Windows Server - il est, comme vous le dites, sur vous l'installer sur vos serveurs si vous voulez l'utiliser. Lorsque AppFabric a été libéré, il a été suggéré qu'il expédierait comme partie de la prochaine version de Windows Server, mais je n'ai pas vu rien sur Windows Server 2012 qui confirme que, pour être le cas.

  • Vous avez besoin de serveurs supplémentaires pour cela, ou au moins il vous est conseillé d'avoir eux. La recommandation de Microsoft pour AppFabric est que vous l'exécutez sur des serveurs dédiés . Ce qui signifie que même si AppFabric lui-même est un téléchargement gratuit , vous pouvez encourir des coûts supplémentaires de licence Windows Server . En parlant de ça ...

  • Vous pourriez avoir besoin de licences Enterprise Edition. Si vous souhaitez utiliser les fonctionnalités haute disponibilité d'AppFabric, vous ne pouvez le faire qu'avec des serveurs exécutant Enterprise Edition, qui est une licence plus onéreuse que l'édition standard ( ).

  • Vous pourriez ne pas en avoir besoin après tout. Cela dépendra de votre application et de la raison pour laquelle vous souhaitez utiliser une couche de mise en cache partagée. Si vous craignez que les caches sur plusieurs serveurs puissent être désynchronisés avec la base de données (ou même entre eux), une utilisation judicieuse des objets pourrait vous aider à résoudre le problème.

+0

Ce que je pensais de l'utilisation de cache pour les petites pièces jointes. Une pièce jointe fait partie d'un objet plus grand à enregistrer. Cet objet est enregistré lorsque l'utilisateur clique sur Enregistrer.Si l'objet n'est pas encore enregistré et que l'utilisateur télécharge un fichier, il doit aller quelque part. Mettre ces données dans la base de données avant que l'objet plus grand ne s'y trouve n'est pas la bonne réponse. Lorsque l'utilisateur annule avant d'enregistrer, l'application devra supprimer ce fichier. Le cache IMO est l'emplacement approprié pour stocker le fichier, car l'élément peut être supprimé de manière plus efficace. Cette logique est-elle défectueuse? –

1

Cet article CodeProject Implementing Local MemoryCache Invalidation with Redis propose une approche pour gérer le scénario que vous décrivez.

Vous n'avez pas mentionné le goût de l'équilibrage de charge que vous utilisez: « collant » ou « apatride ». De loin la solution la plus simple est d'utiliser des sessions collantes.

Si vous souhaitez utiliser des caches de mémoire locale et l'équilibrage de charge sans état, vous pouvez vous retrouver avec des conditions de course les messages de validation croisée serveur arrivent en retard. Cela peut être particulièrement problématique si vous utilisez le modèle Post-Redirect-Get si commun dans ASP.Net MVC. Cela peut être surmonté en utilisant des cookies pour compléter les diffusions d'invalidation de cache. Je détail en a blog post here.

Questions connexes