2011-10-13 2 views
0

Je construis une petite application qui demande aux gens de télécharger des images par email. Il est construit en PHP (sans framework) avec MySQL et S3. Jusqu'à présent, dans mon scénario: les e-mails sont stockés sur un compte POP3. Un script s'exécute chaque minute, récupère l'e-mail le plus ancien, redimensionne l'image, le télécharge sur S3, stocke son chemin dans la base de données, supprime l'e-mail.File d'attente des tâches - un cron fonctionnerait-il?

À plus grande échelle, comment cela serait-il géré? Le travail cron est-il le meilleur moyen de gérer ce type de situation? Que faire si le processus prend plus d'une minute: il va se chevaucher et finalement échouer, non? Ou si cela prend moins d'une minute? Peut-être que je devrais utiliser un fichier .forward pour traiter les emails, mais encore une fois je ne contrôlerais pas le flux. Je crois que la plupart de ces scénarios fonctionnent, je suis juste curieux en ce qui concerne les meilleures pratiques.

Merci!

Répondre

3

Une approche légèrement modifiée pourrait être:

  • exécuter le script de la Cron chaque minute
  • Votre chèque de script si une autre instance de celui-ci est déjà en cours d'exécution et si tel est le cas existe juste
  • Le script en cours traite la file d'attente restante jusqu'à ce qu'elle soit vide ou avec un nombre d'éléments (ex: max 10)

J'ai déjà eu une procédure de sauvegarde qui sauvegardait les répertoires clients heure, si la dernière sauvegarde terminée était antérieure à un certain laps de temps. Cela a fonctionné très bien jusqu'à ce que certains clients aient trop de Go de données et que le script prenne plus d'une heure pour faire la sauvegarde.

Sans le contrôle, l'heure suivante, le script exécutera de nouveau le même client, et cela prendrait également plus d'une heure, et ainsi de suite, jusqu'à ce que la machine ne réponde plus avec un niveau d'exécution très élevé.

Le correctif que j'ai implémenté était le contrôle décrit, si une autre instance était en cours d'exécution, il suffit de quitter et d'attendre le prochain cycle. Après cette réparation, je n'ai jamais eu de problème pendant des années.

1

Essayez d'avoir un processus de longue durée. Il vérifie le courrier et traite tout cela. S'il ne trouve plus de courrier quand c'est fait, il se met en veille pendant une minute.

Si vous avez des problèmes de stabilité, vous pouvez toujours utiliser quelque chose comme supervise.

Questions connexes