2010-06-22 23 views
1

Je suis chargé de la construction d'un processus qui compenser les retards de réplication sur notre système LDAP. Actuellement, il y a un serveur d'écriture et 4 serveurs de lecture. Après avoir écrit une entrée sur le serveur d'écriture, il peut y avoir jusqu'à 4 secondes de retard sur le système avant que l'entrée ne soit répliquée sur les serveurs de lecture. Par conséquent, si j'appelle le service "A" qui met à jour un enregistrement, puis le service "B" immédiatement après lequel est censé lire cet enregistrement, les données seront périmées.processus de travail avec WCF (caching)

Pour résoudre ce problème, je comptais sur la construction d'un service web de mise en cache de sorte qu'aucune interface des applications directement avec la base de données, mais plutôt par le service de mise en cache. Le service stockera toutes les créations, les mises à jour et les suppressions dans un cache (vraisemblablement un List<ModelObject>). Les entrées CRUD - R doivent rester dans le cache pendant au moins quatre secondes. Ensuite, lorsque le service "B" tente de lire, le service de mise en cache vérifie le cache avant d'effectuer l'opération de lecture sur la base de données.

Donc, ma question est en deux parties. 1) Est-ce une solution faisable et si non, quels problèmes voyez-vous? 2) Comment effectuer la maintenance sur le cache dans un service WCF? En d'autres termes, existe-t-il un moyen d'initialiser un thread de travail d'arrière-plan qui efface les entrées du cache qui datent de 4 secondes?

Répondre

1

Pour résoudre ce problème, je planifiait la construction d'un service Web de mise en cache afin qu'aucune application n'interface directement avec la base de données, mais plutôt avec le service de mise en cache.

Cela me semble être la bonne solution.

.NET comprend plusieurs bibliothèques de mise en cache pour rendre facile pour vous. Voici mes favoris:

http://www.infoq.com/news/2010/05/Runtime.Caching http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx

En d'autres termes, est-il un moyen d'initier un thread de travail de fond qui efface les entrées du cache qui sont âgés de 4 secondes?

Vous n'avez pas besoin. Réglez simplement expirationTime sur (maintenant + 4 secondes) lorsque vous ajoutez l'élément au cache.

Mais vraiment vous ne devriez pas avoir besoin d'un temps d'expiration. Si c'est le seul moyen de changer les valeurs, alors il ne devrait jamais expirer.

1

En ce qui concerne # 1, je dirais que ce qui est faisable, bien que la génération de votre propre couche de mise en cache peut avoir ses propres difficultés et les pièges. En tête, je ne peux penser à rien d'autre que de placer toute la charge sur un seul serveur de cache (par opposition aux 4 serveurs LDAP distribués qui peuvent gérer la charge de la requête).

En ce qui concerne # 2, je vous recommande de vérifier le Enterprise Library Caching Application Block, je crois qu'il a toutes les fonctionnalités nécessaires que vous avez besoin, y compris le balayage en fonction du temps, la durée, etc.

+0

Merci. La solution n ° 1 ne fonctionnera pas car ces mêmes serveurs LDAP sont utilisés à la fois pour stocker les données client (prénom, nom de famille, etc.), mais aussi pour l'authentification (liaisons LDAP). Un seul serveur ne serait pas capable de gérer la charge de tous nos utilisateurs s'authentifiant. Cependant, en pensant à votre déclaration, vous m'avez amené à une meilleure solution: Séparer les données client du système d'authentification. – regex