2011-10-18 2 views
0

Je crée une application Web qui permet à un utilisateur de télécharger une image. Lorsque l'image est téléchargée, elle doit être redimensionnée à une ou plusieurs tailles, dont chacune doit être envoyée à Amazon s3 pour être stockée. Les métadonnées et les URL de chaque taille de l'image sont stockés dans un seul enregistrement de base de données sur le serveur Web. J'utilise une file d'attente de messages pour effectuer le redimensionnement et le téléchargement de façon asynchrone (car il y a un potentiel pour les grandes images et plusieurs redimensionnements par requête). Lorsque la tâche de redimensionnement/téléchargement est terminée, l'enregistrement de la base de données doit être mis à jour avec l'URL.Meilleure pratique pour découpler une base de données d'une file d'attente de messages

Mon problème est que le travailleur exécutant la tâche n'aura pas accès à la base de données. Je pensais déclencher un callback http du travailleur à l'application Web une fois la tâche terminée avec les informations appropriées pour la mise à jour de l'enregistrement de la base de données. Y a-t-il d'autres alternatives ou raisons que je devrais faire d'une autre manière? J'utilise python/pylons pour le backend web, mysql pour la base de données et celery/amqp pour la messagerie.

Merci!

+0

"... le travailleur exécutant la tâche n'aura pas accès à la base de données." Une raison particulière pourquoi? –

+0

Pour la plupart, les travailleurs fonctionneront sur des machines différentes et n'auront pas directement accès à la base de données (pour des raisons de sécurité). –

Répondre

2

Il semble que votre objectif n'est pas de découpler la base de données de la MQ, mais plutôt des travailleurs. En tant que tel, vous pouvez créer une autre file d'attente qui reçoit des notifications d'achèvement et un autre travailleur unique qui récupère les notifications et met à jour la base de données de manière appropriée.

+0

+1: Une autre file d'attente. –

+0

Correct, le titre est probablement un peu trompeur. J'avais pensé diviser cela en deux tâches distinctes, mais je n'avais pas pensé à une autre file d'attente. Cela a beaucoup de sens car je peux router les tâches nécessitant un accès à la base de données vers des machines privilégiées. Merci. –

Questions connexes