Comment gérer de manière fiable les fichiers chargés périodiquement par un agent externe?

StackOverflow https://stackoverflow.com/questions/622392

Question

C'est un scénario très courant: certains processus souhaitent déposer un fichier sur un serveur toutes les 30 minutes environ. Simple, non? Eh bien, je peux penser à un tas de façons dont cela pourrait mal tourner.

Par exemple, le traitement d’un fichier peut prendre plus ou moins de 30 minutes. Il est donc possible qu’un nouveau fichier arrive avant que je n’ai fini avec le précédent. Je ne veux pas que le système source écrase un fichier que je traite encore.

D'autre part, les fichiers étant volumineux, le téléchargement de fichiers prend quelques minutes. Je ne veux pas commencer à traiter un fichier partiel. Les fichiers sont simplement transférés avec FTP ou sftp (ma préférence), le verrouillage au niveau du système d'exploitation n'est donc pas une option.

Enfin, j’ai besoin de conserver les fichiers pendant un moment, au cas où j’ai besoin d’inspecter manuellement l’un d’eux (pour le débogage) ou de le traiter à nouveau.

J'ai vu beaucoup d'approches ad-hoc pour mélanger les fichiers de téléchargement, échanger les noms de fichiers, utiliser des horodatages, toucher "l'indicateur". fichiers pour aider à la synchronisation, et ainsi de suite. Ce que je n'ai pas encore vu est un "algorithme" complet pour le traitement de fichiers qui traitent de la simultanéité, de la cohérence et de l’exhaustivité.

J'aimerais donc puiser dans la sagesse des foules ici. Quelqu'un a-t-il déjà trouvé un moyen à toute épreuve de jongler avec des fichiers de données par lots afin qu'ils ne soient jamais traités trop tôt, jamais écrasés, et conservés en toute sécurité après le traitement?

Était-ce utile?

La solution

La clé est de faire le jonglage initial à la fin de l’envoi . Tout ce que l'expéditeur doit faire est:

  1. Stockez le fichier avec un nom de fichier unique.
  2. Dès que le fichier a été envoyé, déplacez-le dans un sous-répertoire appelé par exemple. terminé .

En supposant qu’il n’existe qu’un seul processus de destinataire, le destinataire doit simplement:

  1. Parcourez régulièrement le répertoire complété pour rechercher tous les fichiers.
  2. Dès qu'un fichier apparaît dans complete , déplacez-le dans un sous-répertoire appelé par exemple. traité et commencez à y travailler à partir de là.
  3. Supprimez-le éventuellement lorsque vous avez terminé.

Sur tout système de fichiers sain, les déplacements de fichiers sont atomiques à condition qu’ils se produisent dans le même système de fichiers / volume. Donc, il n'y a pas de conditions de course.

Récepteurs multiples

Si le traitement peut durer plus longtemps que la période entre les fichiers livrés, vous créez un backlog à moins que vous n'ayez plusieurs processus récepteur. Alors, comment gérer le cas multi-récepteur?

Simple: chaque processus du récepteur fonctionne exactement comme avant. La clé est que nous essayons de déplacer un fichier vers traité avant que ne travaille dessus: cela, et le fait que le même fichier se produise est atomique, cela signifie que même si plusieurs les destinataires voient le même fichier dans completed et essayez de le déplacer, un seul réussira. Tout ce que vous avez à faire est de vérifier la valeur renvoyée par rename () ou tout appel du système d’exploitation que vous utilisez pour effectuer le déplacement, et de ne poursuivre le traitement que s’il a réussi. Si le déplacement échouait, un autre destinataire y arrivait en premier. Revenez simplement en arrière et analysez à nouveau le répertoire completed .

Autres conseils

Si le système d'exploitation le prend en charge, utilisez les points d'ancrage du système de fichiers pour intercepter les opérations d'ouverture et de fermeture de fichiers. Quelque chose comme Dazuko . D'autres systèmes d'exploitation peuvent également vous informer des opérations sur les fichiers, par exemple, Novell Open Enterprise Server vous permet de définir des époques et lire la liste des fichiers modifiés au cours d’une époque.

Je viens de me rendre compte que sous Linux, vous pouvez utiliser le sous-système inotify ou les utilitaires du package inotify-tools

Le transfert de fichiers est l’un des classiques de l’intégration système. Je vous recommanderais d’obtenir le livre Modèles d'intégration d'entreprise afin de définir votre propre réponse à ces questions: Dans une certaine mesure, la réponse dépend des technologies et des plates-formes que vous utilisez pour la mise en œuvre des systèmes d'extrémité et pour le transfert de fichiers. C'est une collection assez complète de modèles réalisables et assez bien écrits.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top