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