Question

Je cherche à écrire un démon:

  • lit un message à partir d'une file d'attente (SQS, lapin mq, peu importe ...) contenant un chemin vers un fichier zip
  • met à jour un enregistrement dans la base de données en disant quelque chose comme « ce travail est en train de traiter »
  • lit le contenu de l'archive précitée et insère une ligne dans une base de données w / information tirée à partir des données méta de fichier pour chaque fichier trouvé
  • dupliquer chaque fichier à s3
  • supprime le fichier zip
  • marque le travail comme "complet"
  • lire le message suivant dans la file d'attente, répéter

devrait être en cours d'exécution en tant que service, et initié par un message mis en attente lorsque quelqu'un télécharge un fichier via l'interface Web. le téléchargeur n'a pas besoin de voir immédiatement les résultats, mais le téléchargement est traité en arrière-plan assez opportunément.

im couramment avec python, donc la première chose qui vient à l'esprit est en train d'écrire un serveur simple avec torsadé pour traiter chaque demande et exécuter le processus mentionné ci-dessus. mais je ne ai jamais écrit quelque chose comme ça qui fonctionnerait dans un contexte multi-utilisateurs. sa ne va pas au service des centaines de téléchargements par minute ou à l'heure, mais ce serait bien si elle pouvait gérer plusieurs à la fois, raisonnable. Je suis aussi pas très familier avec l'écriture d'applications multi-thread et de traiter des questions comme le blocage.

Comment les gens ont résolu ce dans le passé? quelles sont les autres approches que je pourrais prendre?

Merci d'avance pour toute aide et discussion!

Était-ce utile?

La solution 3

i choisi d'utiliser une combinaison de céleri ( http://ask.github.com/ céleri / introduction.html ), rabbitmq et simple vue django pour gérer les téléchargements. le flux de travail ressemble à ceci:

  1. vue django accepte, télécharger magasins
  2. est envoyé un Task de céleri pour traiter le téléchargement. tout le travail se fait à l'intérieur du Task.

Autres conseils

Je l'ai utilisé beanstalkd comme un démon pour faire la queue très bon effet (certains temps quasi le traitement et l'image redimensionnement - plus de 2 millions à ce jour dans les dernières semaines). Jetez un message dans la file d'attente avec le nom de fichier zip (peut-être d'un répertoire spécifique) [Je serialise une commande et paramètres JSON], et lorsque vous réservez le message dans votre travailleur-client, personne d'autre ne peut le faire, à moins que vous autorisez à la temporisation (quand il remonte à la file d'attente pour être pris en charge).

Le reste est le dézipper et le téléchargement à S3, pour lesquels il existe d'autres bibliothèques.

Si vous voulez gérer plusieurs fichiers zip à la fois, exécutez autant de processus de travail que vous voulez.

J'éviter de faire quoi que ce soit multi-thread et d'utiliser plutôt la file d'attente et la base de données pour synchroniser autant de processus de travail que vous le souhaitez démarrer.

Pour cette application, je pense torsadé ou tout autre cadre pour la création d'applications de serveur va être surpuissant.

Keep it simple. script Python démarre, vérifie la file d'attente, fait un certain travail, vérifie la file d'attente à nouveau. Si vous voulez un démon approprié de fond que vous pouvez faire juste que vous détachez du terminal comme décrit ici: Comment créer un démon en Python?

Ajoutez un peu de l'exploitation forestière, peut-être essayer / except pour envoyer les échecs à vous.

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