Comment mettre en cache les lectures de database dans les rôles Azure?

Dans mon rôle Azure, j'ai beaucoup d'entités qui doivent être stockées dans une database SQL Azure. Actuellement, chaque fois que j'ai besoin de lire une entité, je lance une requête SQL Azure.

Je soupçonne que cela va bientôt devenir un goulot d'étranglement, donc je dois implémenter une sorte de caching – une structure de memory qui lit datatables lors du premier access puis les stocke pendant un certain time et renvoie datatables mises en cache sur les lectures suivantes. Crafting une telle structure ne devrait pas être difficile, je suis sûr que je peux find le code facilement disponible.

Le problème est ce que je fais avec écrit à partir de plusieurs instances? Par exemple, l'instance 1 lit datatables et les met en cache, l'instance 2 modifie la database. À less que l'instance 1 ne sache qu'elle doit relire la database et qu'elle relit réellement la database, elle fonctionne avec datatables erronées. Je n'ai aucune idée de la façon de le faire facilement.

Existe-t-il un moyen simple de garder cohérentes les caches de différentes instances?

C'est là que la caching dissortingbuée entre en jeu, et sur Azure, cela signifie généralement que Windows Azure AppFabric Caching

L'idée derrière la caching dissortingbuée est que le cache est centralisé et potentiellement réparti sur plusieurs servers (pour plus d'efficacité), de sorte qu'une request de données n'a pas besoin d'aller à la database, généralement relativement coûteuse en termes de performances. , ces données n'ont pas à être mises en cache localement dans chaque process.

Bien que n'étant évidemment pas aussi efficace que la caching in-proc, la caching dissortingbuée présente plusieurs avantages –

  1. Cela empêche plusieurs appels à la source sous-jacente
  2. Avec le cache hors process (et, en fait, sur un server différent), il a réduit la pression sur la memory locale
  3. Les clients profitent des récupérations réciproques – c.-à-d. Si un client apporte des données dans le cache, les parameters de security le permettent, d'autres clients ont maintenant access à ces informations pour que l'utilisation du cache soit plus grande

Cela signifie également que les clients ayant une connaissance actualisée de 'la vérité' peuvent mettre à jour le cache ou même l'invalider, ce qui profiterait immédiatement à tous les autres clients partageant le même cache.

En outre – étant un model dissortingbué – la batterie de cache peut être étendue pour répondre à de nombreuses requests, bien que sur Azure – comme le cache est offert en tant que service, c'est la plate-forme qui s'occupe plutôt que le propriétaire, qui est l'un des gros avantages des informations PaaS et Windows Azure dans le cache

Vous pouvez utiliser la caching d'AppFabric comme l'a dit Yossi, mais vous pouvez également utiliser Memcached .

Si vous souhaitez utiliser la caching Azure AppFabric et que vous souhaitez que datatables soient cohérentes, vous pouvez désactiver la caching locale.

L'inconvénient est que si vous sortez plus de quelques éléments du cache par request, cela va être un goulot d'étranglement majeur. Vous pouvez essayer de contourner ce problème en combinant vos objects en cache dans un grand object.

J'ai posté une question qui touche à ce sujet sur le forum de Microsoft, et la réponse pour l'instant est que datatables obsolètes sont juste quelque chose à vivre si la caching locale est nécessaire.

D'un autre côté, si la caching locale est requirejse et que vous utilisez un rôle Web, l'ancienne caching ASP.Net peut être une meilleure option et n'est pas payante.