Question

J'ai une application dans Django qui doit envoyer un grand nombre de courriels aux utilisateurs dans différents cas d'utilisation. Je ne veux pas gérer cela de manière synchrone dans l'application pour des raisons évidentes.

Quelqu'un a-t-il des recommandations pour un serveur de mise en file d'attente des messages s'intégrant bien à Python, ou a-t-il déjà été utilisé pour un projet Django? Le reste de ma pile est Apache, mod_python, MySQL.

Était-ce utile?

La solution

Jusqu'à présent, je n'ai trouvé aucun "gentil". solution pour cela. J'ai des exigences plus strictes en temps réel (prendre une photo dans une boîte en carton étiquetée), donc l'une des approches est assez rapide pour vous. Je suppose que les courriels peuvent attendre quelques minutes.

  • Une "liste de tâches" " dans la base de données traitée par un travail cron.
  • Une "liste de tâches" " dans la base de données traitée en permanence, interrogée par un démon.
  • Utilisation d'un démon personnalisé qui est notifié par le serveur Web via un paquet UDP (en production aujourd'hui). Fondamentalement, mon propre système Queing avec la pile IP pour traiter la file d'attente.
  • Utiliser ActiveMQ en tant que courtier de messages - cela n'a pas été le cas travailler en raison de problèmes de stabilité. Pour moi aussi, les démons Java sont généralement un peu charnus
  • Utilisation des déclencheurs de mise à jour dans CouchDB. Bien que les déclencheurs de mise à jour ne soient pas conçus pour le traitement d’images lourdes, ils ne conviennent donc pas à mon problème.

Jusqu'à présent, je n'ai pas encore essayé RabbitMQ et XMPP / ejabebrd pour traiter le problème, mais ils figurent sur ma liste de prochaines choses à essayer. RabbitMQ a obtenu une connectivité Python décente en 2008 et de nombreuses bibliothèques XMPP sont disponibles.

Mais vous n'avez peut-être besoin que d'un serveur de courrier correctement configuré sur la machine locale. Cela vous permettrait probablement de transférer des messages de manière synchrone dans le serveur de courrier local et ainsi de simplifier considérablement l’ensemble de votre logiciel.

Autres conseils

Dans votre cas spécifique, où il ne s'agit que d'une file d'attente d'e-mails, je choisirais la solution de facilité en utilisant django-mailer . En tant que bon côté, il existe d’autres projets pouvant être connectés qui sont suffisamment intelligents pour tirer parti de django-mailer quand ils le voient dans la pile.

En ce qui concerne les solutions de file d’attente plus générales, je n’ai pas encore pu essayer ces solutions, mais voici une liste de solutions qui me paraissent plus intéressantes:

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

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

Nous disposons d’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 ce dernier transmet l'événement à un processus consommateur qui effectue la tâche asynchrone (envoie l'e-mail).

Cela évolue plutôt bien parce que vous pouvez ajouter des processus consommateur au moment de l'exécution: deux consommateurs peuvent envoyer deux fois plus de courriels et les consommateurs peuvent se trouver sur des machines distinctes. Une légère complication tient au fait que chaque consommateur a besoin de sa propre file d'attente nommée. Django doit donc savoir combien de consommateurs sont disponibles et envoyer des événements à chaque file d'attente de manière alternée. (Deux consommateurs écoutant dans la même file obtiendront chacun un message = duplication). Si vous ne voulez qu'un seul processus consommateur, alors ce n'est pas un problème.

Nous avions auparavant des processus qui interrogeaient la base de données en permanence pour rechercher des travaux, mais trouvaient que celle-ci ajoutait beaucoup de charge au système, même lorsque rien ne devait être traité.

Ajoutez simplement les courriels à une base de données, puis écrivez un autre script exécuté par un utilitaire de planification de tâches (cron vient à l’esprit) pour envoyer les courriels.

Vous pouvez consulter pymq . Il est écrit en python, parle HTTP avec ses clients et offre une foule d’options de surveillance et de gestion pour les files d’attente.

Y a-t-il quelque chose qui cloche qui consiste à résoudre ce problème en utilisant l'infrastructure de messagerie? Par exemple, chaque serveur d’applications exécutant ses propres démons de messagerie, qui met en file d'attente tout courrier soumis localement, qui le transfère à un serveur de messagerie centralisé pouvant effectuer le gros du courrier?

http://www.snakemq.net/ pourrait également fonctionner

Si vous avez déjà installé MySQL, vous pouvez créer une table à utiliser comme "liste de tâches". de toutes sortes.

Les threads ajoutent des tâches de manière synchrone à la table et une tâche par lot supprime les tâches à mesure qu'elles sont terminées.

De cette manière, il n’est pas nécessaire d’installer et d’apprendre plus de logiciels, et cela devrait fonctionner comme un magasin de travaux persistant tant que vous n'envoyez pas beaucoup de courriels (comme > 10 / sec).

Voici une solution paresseuse mais correcte et adéquate. Utilisez la table de base de données suivante en tant que file d'attente.

drop table if exists mailqueue;
create table mailqueue (
    id bigint primary key,
    subject text not null,
    body mediumtext not null,
    from varchar(255) not null,
    to varchar(255) not null
);

Les expéditeurs doivent insérer de nouvelles lignes à la fin de cette table.

Configurez les threads de travail pour qu'ils ouvrent les mails un par un à partir de l'autre extrémité (identifiant le plus bas) et tentez de les envoyer.

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