2010-11-12 8 views
1

J'ai un service Windows écrit en C# qui surveille un dossier pour les fichiers à traiter. Lorsque des fichiers sont ajoutés à ce dossier, le service doit ramasser le fichier et effectuer une tâche avec lui, en consommant le fichier dans le processus.Stratégies d'accès aux fichiers distribués

Je voudrais distribuer le travail sur plusieurs serveurs physiques pour la tolérance aux pannes. Les fichiers seront placés sur le NAS accessible à toutes les instances de service.

L'exigence importante est que je voudrais que chaque service prenne un dossier exclusivement; un fichier ne doit pas être traité par plusieurs services.

Y a-t-il de bonnes stratégies pour travailler avec des fichiers de cette manière?

Répondre

3

La solution la plus simple, me semble-t-il, serait de créer un fichier .lock. Donc, si ServiceA voit un fichier appelé myfile.dat, il recherchera un fichier myfile.dat.lock. S'il ne le trouve pas, il en créerait un; Les services de sous-séquence verront le fichier myfile.data.lock et passeront par-dessus ce fichier.

Il est toujours possible que deux services tentent de créer le fichier .lock au même moment, mais l'un de ces services recevra une exception pour tenter de créer un fichier en double. Vous pouvez donc gérer cette exception et réessayer la vérification du fichier .lock (ou simplement l'ignorer) et continuer à partir de là.

+0

J'aime le son de cette approche, mais comment gérer un processus se terminant brusquement et laisser un fichier '.lock' présent? (En supposant que le travail inachevé peut être repris en toute sécurité) –

+0

C'est toujours un problème; une approche consiste à écrire une logique de "l'expiration". Autrement dit, le processus qui gère le fichier peut continuer à mettre à jour l'horodatage du fichier '.lock' ou vous pouvez placer un horodatage _in_ dans le fichier' .lock'. Ensuite, d'autres processus pourraient détecter, basé sur le fait que l'horodatage n'a pas changé en 5 minutes (juste un exemple), et "prendre en charge" ce fichier de verrouillage. – CodingGorilla

+0

Keep-alives sur le fichier '.lock' rend cette solution assez bonne pour moi. –

1

Vous pouvez déployer Apache ZooKeeper. Lorsqu'un serveur de traitement souhaite travailler sur un fichier, il crée et verrouille un «nœud», travaille sur le fichier, puis déverrouille le nœud. Si le traitement du fichier une fois et une fois seulement est une exigence importante, je ne ferais pas rouler le vôtre. Il est plus difficile à implémenter qu'il n'y paraît, et ZooKeeper le gérera correctement.

+0

Peut-être la réponse "correcte", mais je ne pense pas que nous ayons l'infrastructure facilement disponible pour mettre en œuvre cela. Devra examiner. –

Questions connexes