44 votes

Conseils sur Python/Django et les files d'attente de messages

J'ai une application en Django, qui a besoin d'envoyer un grand nombre d'emails aux utilisateurs dans divers cas d'utilisation. Je ne veux pas gérer cela de manière synchrone dans l'application pour des raisons évidentes.

Est-ce que quelqu'un a des recommandations pour un serveur de file d'attente de messages qui s'intègre bien avec Python, ou qu'ils ont utilisé dans un projet Django? Le reste de ma pile est Apache, mod_python, MySQL.

24voto

Van Gale Points 21982

Dans votre cas spécifique, où il s'agit simplement d'une file d'attente d'e-mails, je prendrais le chemin le plus simple et j'utiliserais django-mailer. En bonus, il existe d'autres projets enfichables qui sont assez intelligents pour tirer parti de django-mailer lorsqu'ils le voient dans la pile.

Quant aux solutions de file d'attente plus générales, je n'ai pas encore pu essayer l'une de celles-ci, mais voici une liste de celles qui me semblent plus intéressantes :

  1. pybeanstalk/beanstalkd
  2. interface Python à gearman (qui est probablement beaucoup plus intéressant maintenant avec la sortie de la version C de gearman)
  3. memcacheQ
  4. stomp
  5. Celery

3 votes

Pour ce besoin spécifique, évitez les tracas et utilisez django-mailer ; cela fonctionne très bien. +1

2 votes

Je suis maintenant en train d'expérimenter avec pypi.python.org/pypi/celery et ça a l'air très très bien.

14voto

mdorseif Points 7473

Jusqu'à présent, je n'ai trouvé aucune solution "agréable" pour cela. J'ai des exigences de temps réel strictes (prendre une photo d'une boîte en carton en cours d'étiquetage) donc probablement l'une des approches est assez rapide pour vous. Je suppose que les emails peuvent attendre quelques minutes.

  • Une "liste de tâches" dans la base de données traitée par un cron job.
  • Une "liste de tâches" dans la base de données traitée en permanence en étant interrogée par un démon.
  • Utilisation d'un démon personnalisé notifié par le serveur web via un paquet UDP (en production aujourd'hui). Fondamentalement, mon propre système de file d'attente avec la pile IP pour gérer la file d'attente.
  • Utilisation d'ActiveMQ comme courtier de messages - cela n'a pas fonctionné en raison de problèmes de stabilité. De plus, pour moi, les Démon Java sont généralement quelque peu lourds.
  • Utilisation des déclencheurs de mise à jour dans CouchDB. Bien mais les déclencheurs de mise à jour ne sont pas destinés à un traitement d'image intensif, donc pas adaptés à mon problème.

Jusqu'à présent, je n'ai pas essayé RabbitMQ et XMPP/ejabebrd pour résoudre le problème mais ils figurent sur ma liste des prochaines choses à essayer. RabbitMQ a obtenu une connectivité décente avec Python en 2008 et il existe des tonnes de bibliothèques XMPP.

Mais peut-être que tout ce dont vous avez besoin est un serveur de messagerie correctement configuré sur la machine locale. Cela vous permettrait probablement de déposer les emails de manière synchrone dans le serveur de messagerie local et ainsi simplifier l'ensemble de votre pile logicielle.

0 votes

Quelle version d'ActiveMQ avez-vous essayée? Où je travaille, nous avons écrit tout un gestionnaire NMS basé sur elle et avons rencontré des problèmes avec la nouvelle version mais pas avec l'ancienne version 4.x.

0 votes

Je me souviens vaguement que nous avons utilisé des versions 4.x "stables" et des versions bêta.

5 votes

BTW: nous utilisons maintenant RabbitMQ en production et sommes très heureux lapins jusqu'à présent.

6voto

Gruff Points 538

Stompserver est une bonne option. Il est léger, facile à installer et facile à utiliser à partir de Django/python.

Nous avons un système utilisant stompserver en production pour l'envoi d'e-mails et le traitement d'autres tâches de manière asynchrone.

Django enregistre les e-mails dans la base de données, un gestionnaire model.post_save dans Django envoie un événement à stompserver et stompserver transmet l'événement à un processus consommateur qui effectue la tâche de manière asynchrone (envoie l'e-mail).

Il s'adapte assez bien car vous pouvez ajouter des processus consommateurs en cours d'exécution - deux consommateurs peuvent envoyer le double d'e-mails, et les consommateurs peuvent être sur des machines distinctes. Une légère complication est que chaque consommateur a besoin de sa propre file d'attente nominée, donc Django doit savoir combien de consommateurs sont disponibles et envoyer les événements à chaque file d'attente de manière circulaire. (Deux consommateurs écoutant sur la même file d'attente recevront tous les deux chaque message = duplication). Si vous ne voulez qu'un seul processus consommateur, ce n'est pas un problème.

Nous avions auparavant des processus qui interrogeaient en continu la base de données pour des tâches mais nous avons constaté que cela ajoutait beaucoup de charge au système, même lorsqu'il n'y avait rien à traiter.

1voto

nosklo Points 75862

Il suffit d'ajouter les emails à une base de données, puis d'écrire un autre script exécuté par un utilitaire de planificateur de tâches (cron vient à l'esprit) pour envoyer les emails.

1voto

dhruvbird Points 1553

Vous voudrez peut-être jeter un coup d'œil à pymq. Il est écrit en python, communique en HTTP avec ses clients et offre une multitude d'options de surveillance et de gestion pour les files d'attente.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X