2009-06-22 4 views
1

Je cherche quelques stratégies concernant l'accès à certaines données mises en cache qui résident dans un service Web interne de l'entreprise. En fait, empêcher l'accès aux données mises en cache pendant l'actualisation du cache.Stratégies pour l'accès au cache pendant l'actualisation?

Nous avons un service Web .NET 3.5 C# exécuté sur une batterie de serveurs Web qui conserve un cache d'une demi-douzaine de jeux de données. Ces données sont des éléments associés à la configuration qui sont référencés par le domaine de la logique métier «réel» qui s'exécute également dans ce service Web et qui sont renvoyés pour toutes les utilisations client. Probablement parlant un total d'une douzaine de tables avec quelques milliers de disques.

Nous avons implémenté un mécanisme de mise en cache à l'aide de MS Enterprise Library 4.1. Il n'y a pas de raison majeure pour l'utiliser sur le cache ASP.Net, sauf que nous utilisions déjà Enterprise Library pour d'autres choses et nous avons aimé la gestion de l'expiration du cache. C'est la première fois que nous avons mis en place une mise en cache ici, peut-être que je manque quelque chose de fondamental ...

Cette donnée de configuration ne change pas trop souvent - probablement quelques fois par jour. Lorsque ces données de configuration changent, nous mettons à jour le cache sur le serveur particulier auquel la demande de mise à jour est adressée avec les nouvelles données (le processus de mise à jour passe par le service Web). Pour les autres serveurs de la batterie de serveurs Web (3 serveurs au total), l'expiration du cache est fixée à 15 minutes, à partir desquelles les données sont rechargées à partir de la base de données unique que tous les serveurs de la batterie touchent. Pour nos besoins particuliers, ce délai entre les serveurs est acceptable (bien que je ne pense pas idéal).

Au cours de ce processus d'actualisation, d'autres demandes peuvent nécessiter l'accès aux données. Comme la requête peut provenir d'un processus d'expiration/actualisation, il n'y a pas de données actuellement dans le cache, ce qui cause évidemment des problèmes.

Quelles sont les stratégies pour résoudre ce problème? Si cela se passait dans un seul type d'application de type WinForm, nous pourrions pirater quelque chose qui empêcherait l'accès pendant l'actualisation par l'utilisation de variables/boucles de classe, de threading/mutex, ou d'une autre structure singleton. Mais je me méfie de l'implémentation de quelque chose comme ça qui tourne sur une ferme web. Devrais-je être? Un mécanisme de mise en cache de serveur distribué est-il le moyen d'aller au lieu de chaque serveur ayant son propre cache? Je voudrais éviter de le faire pour l'instant si je pouvais et trouver un code pour contourner ce problème. Est-ce que je manque quelque chose?

Merci pour toute contribution. MISE À JOUR: J'allais utiliser la fonctionnalité de mot clé Lock autour de l'action d'expiration qui actualise les données par la suite, mais j'étais inquiet de le faire sur un serveur Web. Je pense que cela aurait fonctionné bien qu'il me semble qu'il y aurait toujours une possibilité (bien que moindre) que nous aurions pu saisir des données du cache vide entre le moment où il a expiré et le moment où le verrou a été entré (l'action d'expiration se produit sur un autre fil je pense). Donc, ce que nous avons fait, c'est que s'il n'y avait pas de données dans le cache lors d'une demande régulière de données, nous supposons qu'il est en train d'être actualisé et saisissez simplement les données de la source à la place. Je pense que cela fonctionnera puisque nous pouvons supposer que le cache doit être rempli à tout moment puisque le processus de remplissage du cache initial se produira lorsque la classe singleton qui contient le cache est créée lors d'une première demande de service Web. Ainsi, si le cache est vide, cela signifie qu'il est actuellement en cours de remplissage, ce qui ne prend normalement que quelques secondes. Par conséquent, les demandes de données provenant du cache pendant cette période seront les seules à ne pas atteindre le cache.

Si quelqu'un ayant de l'expérience souhaite apporter plus de lumière à ce sujet, il serait apprécié.

Répondre

0

Il me semble que vous distribuez déjà des données périmées.Donc, si cela est autorisé, pourquoi ne remplissez-vous pas une nouvelle copie du cache lorsque vous découvrez son ancien et unique passage à l'utiliser une fois qu'il est complètement peuplé.

+0

Oui, la diffusion de données obsolètes est correcte (jusqu'à 15 minutes). Nous n'avons pas vraiment le moyen de vérifier si le statut est périmé par rapport à l'un des autres serveurs de la batterie (si ce serveur n'était pas celui qui recevait les données mises à jour) - sans revenir à la base de données pour vérifier un horodatage ou quelque chose, que nous essayons d'éviter. –

0

Cela dépend vraiment de la logique de mise à jour. Où est-ce que vous décidez de mettre à jour le cache? Pouvez-vous propager la mise à jour à tous les serveurs de la batterie? Ensuite, vous devriez verrouiller lors de la mise à jour. Si votre processus de mise à jour est initié par une action de l'utilisateur, pouvez-vous informer les autres serveurs qu'ils doivent expirer leur cache?

+0

Le cache sur l'un des serveurs de la batterie est mis à jour lorsqu'une mise à jour des données est envoyée (chacun de nos clients reçoit une copie des données). Cette mise à jour est une occurrence semi-rare effectuée par des personnes de niveau administrateur (bien que lors de la mise à jour, elles ont tendance à apporter beaucoup de changements). Nous n'avons actuellement aucun moyen de propager ou de notifier les autres serveurs de la batterie car nous n'utilisons pas de mécanisme de mise en cache et ne souhaitons pas écrire les nôtres de la même manière que l'utilisation d'un type d'indicateur de base de données centrale. J'ai pensé que ce serait peut-être une mauvaise idée de verrouiller le cache tout en rafraîchissant dans un environnement de serveur Web. –

+0

Nous avons en fait 'résolu' ceci en récupérant les données directement à partir de la base de données source si le cache est vide - nous supposons que si le cache est vide, nous sommes en train de le rafraîchir. Bien que cela puisse être coûteux en termes de performance, nous avons pensé que c'était préférable à une sorte de verrouillage. Cela ne peut se produire que lors d'un rafraîchissement qui se produit toutes les 15 minutes - et seulement pendant les quelques secondes nécessaires pour remplir le cache. C'est un succès acceptable en fonction de la nature des données et de la probabilité que cela se produise. –

Questions connexes