2010-06-14 4 views
0

Je suis en train de créer une passerelle entre les messages rabbitmq et l'application Django pour stocker l'état des tâches d'arrière-plan dans la base de données, afin de pouvoir publier de nouvelles tâches via Django interface d'administration. Je suppose que ce n'est rien d'extraordinaire, juste un modèle standard de producteur-consommateur.Stockage de l'état d'une tâche entre plusieurs processus django

  1. application Web publie à la file d'attente de messages et insère l'état initial de la tâche dans la base de données
  2. consommation, qui est un processus de python séparé, gère le message et met à jour l'état de la tâche en fonction de la sortie de la tâche

Le problème est que certaines tâches manquent dans la base de données et ne sont donc jamais exécutées. Je suppose que c'est parce que le client reçoit le message plus tôt que la validation db est effectuée. Donc, fondamentalement, revenir de Model.save() ne signifie pas que la transaction est terminée et que toute la communication est rompue.

Y at-il un moyen de résoudre ce problème? Peut-être une sorte de signal post_transaction que je pourrais utiliser?

Merci d'avance.

+0

Qu'est-ce que c'est exactement "Model.save()"? –

+0

@Aaron Digulla: TaskState.save() – user366148

Répondre

0

Cela me semble fragile: vous avez une application web qui enregistre dans une file d'attente et puis insère l'état initial dans la base de données. Que se passe-t-il si le consommateur traite le message avant que l'application Web puisse valider l'état initial? Que se passe-t-il si l'application Web tente d'insérer le nouvel état alors que la base de données est verrouillée par le consommateur?

Pour résoudre ce problème, l'application Web doit ajouter l'état initial au message et le consommateur doit être le seul à écrire dans la base de données.

[EDIT] Et vous pourriez également avoir un problème avec la journalisation. Vérifiez que les courses entre l'application Web et le consommateur produisent les erreurs appropriées dans le journal en mettant un message dans la file d'attente sans en modifiant la base de données.

[EDIT2] Quelques idées:

Que diriez-vous montrant que le nombre de tâches en attente? Pour cela, l'application Web pourrait écrire dans la table 1 et le consommateur écrit dans la table 2 et l'administrateur si montrerait la différence.

Pourquoi l'application Web ne peut-elle pas voir les tâches en attente que le client a dans la file d'attente? Peut-être que vous devriez avoir deux consommateurs. Le premier consommateur ajoute simplement la tâche à la base de données, valide, puis envoie un message au second consommateur avec seulement la clé primaire de la nouvelle ligne. L'administrateur peut lire la table pendant que le second consommateur lui écrit.

Dernière idée: validez la transaction avant de mettre le message en file d'attente. Pour cela, il suffit d'envoyer "commit" à la base de données. Cela va sembler étrange (et je ne le recommande certainement pas) mais ici, il peut être judicieux de valider la nouvelle ligne manuellement (c'est-à-dire avant de revenir à votre framework qui gère la logique de transaction normale).

+0

Eh bien, il insère d'abord en premier, puis publie (en termes d'exécution de code séquentielle) et exactement ce qui se passe est le consommateur reçoit parfois le message avant de commettre. Si le consommateur est le seul à écrire dans la base de données, je ne pourrai pas voir les tâches en attente via l'interface d'administration, qui est la fonctionnalité que je souhaite. – user366148

0

application Web publie à la file d'attente de messages et insère l'état initial de la tâche dans la base de données

Ne faites pas cela.

L'application Web publie dans la file d'attente. Terminé. Présentez les résultats via un modèle et terminez la transaction Web. Un consommateur extrait de la file d'attente et fait des choses. Par exemple, il peut ajouter à un journal de la base de données pour présentation à l'utilisateur. Le consommateur peut également publier un statut supplémentaire dans la base de données lorsqu'il exécute des tâches.

En effet, de nombreuses applications ont plusieurs files d'attente avec plusieurs relations produit/consommateur. Chaque processus peut ajouter des choses à un journal.

La présentation doit alors résumer les entrées du journal. Souvent, le dernier est un résumé suffisant, mais parfois vous avez besoin d'un nombre ou d'informations provenant d'entrées antérieures.

Questions connexes