2008-10-21 8 views
2

J'ai une application qui s'exécute sur plusieurs serveurs IIS qui doivent analyser un fichier CSV placé sur un lecteur réseau commun. Si j'utilise le System.IO.FileSystemWatcher Created event pour être averti de l'événement lorsque le fichier est disponible, comment puis-je m'assurer qu'un seul serveur analyse le fichier? Si tous les serveurs sont informés de cette modification, tous essaieront de l'analyser. Le premier serveur devrait-il le copier localement, puis l'analyser? Cela causerait-il des erreurs sur les autres serveurs? Devrais-je définir l'accès au répertoire distant pour autoriser uniquement un accès en lecture au serveur?Autoriser uniquement un serveur à accéder à un fichier sur un lecteur réseau

Le fichier contient des enregistrements qui doivent être insérés dans une base de données partagée, mais il n'existe aucune clé unique pour les enregistrements. Par conséquent, si plus d'un serveur saisit le fichier en même temps et insère les enregistrements, il y aura des doublons dans la base de données.

+0

Peut-être que changer le titre aiderait à attirer l'attention sur la question? IIS et FileSystemWatcher n'ont rien à voir avec le problème principal, je recommanderais de les laisser de côté. – Tomalak

Répondre

2

La question clé est la suivante: Est-ce que quelque chose de mal se produit lorsque tous essaient d'analyser le fichier à peu près en même temps? L'accès en lecture multiple est essentiellement autorisé au niveau du système de fichiers, de sorte que ce seul fait n'entraînera pas forcément de rupture.

J'essaierais probablement la méthode de créer un fichier de verrouillage sur le premier accès au fichier et de faire en sorte que les serveurs recherchent le fichier de verrouillage avant d'accéder au fichier. Supprimez le fichier de verrouillage lorsque vous avez terminé.

Vous pouvez également placer un verrou exclusif sur le fichier, un seul serveur sera capable de le faire à la fois. Les autres échoueront en essayant:

FileStream fs = new FileStream(
    FilePath, 
    FileMode.Open, 
    FileAccess.ReadWrite, 
    FileShare.None 
); 
0

Une autre option à la place du verrou est de renommer le fichier dans un répertoire. Créez un sous-répertoire pour chaque serveur, puis demandez à un serveur d'essayer de renommer le fichier dans son répertoire (renommer est une opération atomique). Celui qui a réussi réussit à analyser le fichier.

Le problème de verrouillage sera difficile car le fichier sera toujours visible pour chaque serveur et ils pourraient essayer d'ouvrir le fichier, puis répéter l'erreur. Le renommage sera absolu quant au propriétaire du fichier. De plus, gardez à l'esprit la solution que vous utiliserez pour qu'il y ait la possibilité d'un "fichier perdu". Si un serveur arrête de traiter un fichier (erreur, exception, redémarrage ...) il peut être abandonné. La solution typique à ces types de problèmes est en plus de choses comme l'observateur de fichiers que vous avez des serveurs de sondage de temps en temps.

Copier le fichier dans un répertoire serveur vous aidera un peu. Un inconvénient serait que si un serveur est complètement hors ligne, alors son fichier sera placé dans un répertoire jusqu'à ce que le serveur revienne en ligne.

Questions connexes