Domanda

Ho un'applicazione in Django, che deve inviare un gran numero di e-mail agli utenti in vari casi d'uso. Non voglio gestirlo in modo sincrono all'interno dell'applicazione per ovvi motivi.

Qualcuno ha qualche consiglio per un server di accodamento messaggi che si integra bene con Python o che ha utilizzato in un progetto Django? Il resto del mio stack è Apache, mod_python, MySQL.

È stato utile?

Soluzione

Finora non ho trovato " bello " soluzione per questo. Ho alcuni requisiti in tempo reale più rigidi (scattare una foto da una scatola di cartone etichettata) quindi probabilmente uno degli approcci è abbastanza veloce per te. Presumo che le e-mail possano attendere alcuni minuti.

  • A " todo list " nel database elaborato da un processo cron.
  • A " todo list " nel database elaborato in modo permanente essendo sottoposto a polling da un demone.
  • Utilizzo di un demone personalizzato che viene notificato dal server Web tramite un pacchetto UDP (in produzione oggi). Fondamentalmente il mio sistema di accodamento con lo stack IP per la gestione della coda.
  • Utilizzo di ActiveMQ come broker di messaggi - questo non è stato allenarsi a causa di problemi di stabilità. Anche per me i demoni Java sono generalmente un po 'paffuti
  • Uso dei trigger di aggiornamento in CouchDB. Bello, ma i trigger di aggiornamento non sono pensati per l'elaborazione di immagini pesanti, quindi non sono adatti al mio problema.

Finora non ho provato RabbitMQ e XMPP / ejabebrd per gestire il problema, ma sono nella mia lista delle prossime cose da provare. RabbitMQ ha ottenuto una buona connettività Python nel 2008 e ci sono tonnellate di librerie XMPP.

Ma forse tutto ciò che serve è un mailserver correttamente configurato sul computer locale. Ciò probabilmente ti consentirebbe di scaricare le mail in modo sincrono nel mailserver locale e rendere così tutto il tuo stack software molto più semplice.

Altri suggerimenti

Nel tuo caso specifico, in cui si tratta solo di una coda di posta elettronica, vorrei semplicemente uscire e usare django-mailer . Come bonus extra ci sono altri progetti collegabili che sono abbastanza intelligenti da sfruttare django-mailer quando lo vedono nello stack.

Per quanto riguarda le soluzioni di coda più generali, non sono stato ancora in grado di provare nessuno di questi, ma ecco un elenco di quelli che mi sembrano più interessanti:

  1. pybeanstalk / beanstalkd
  2. interfaccia Python per gearman ( che è probabilmente molto più interessante ora con il rilascio della versione C di gearman )
  3. memcacheQ
  4. stomp
  5. Sedano

Stompserver è una buona opzione. È leggero, facile da installare e facile da usare da Django / Python.

Abbiamo un sistema che utilizza stompserver in produzione per inviare e-mail ed elaborare altri lavori in modo asincrono.

Django salva le e-mail nel database, un gestore model.post_save in Django invia un evento a stompserver e stompserver passa l'evento a un processo consumer che esegue l'attività asincrona (invia l'e-mail).

Si espande abbastanza bene perché è possibile aggiungere processi di consumo in fase di esecuzione: due consumatori possono inviare il doppio del numero di e-mail e i consumatori possono trovarsi su macchine separate. Una leggera complicazione è che ogni consumatore ha bisogno della propria coda denominata, quindi Django deve sapere quanti consumatori sono disponibili e inviare eventi a ciascuna coda in modo round robin. (Due consumatori che ascoltano sulla stessa coda riceveranno entrambi i messaggi = duplicazione). Se desideri un solo processo consumer, questo non è un problema.

In precedenza avevamo processi che eseguivano il polling continuo del database per i lavori, ma abbiamo scoperto che stava aggiungendo molto carico al sistema, anche quando non era necessario elaborare nulla.

Basta aggiungere le e-mail a un database, quindi scrivere un altro script eseguito da un'utilità di pianificazione attività (mi viene in mente cron) per inviare le e-mail.

Potresti dare un'occhiata a pymq . È scritto in Python, parla HTTP con i suoi client e consente una serie di opzioni di monitoraggio e gestione delle code.

C'è qualcosa di sbagliato nel risolverlo usando l'infrastruttura di posta? Ad esempio, ogni server di app che esegue i propri demoni di posta che metterà in coda qualsiasi posta inviata localmente, che inoltra a un server di posta centralizzato che può rendere pesante la posta?

http://www.snakemq.net/ potrebbe anche funzionare

Se hai già installato MySQL, puoi creare una tabella da utilizzare come " todo list " di sorta.

I thread aggiungono in modo sincrono i lavori alla tabella e un'attività in batch rimuove i lavori quando vengono completati.

In questo modo, non è necessario installare e apprendere più software e dovrebbe funzionare bene come archivio di lavoro persistente fintanto che non invii lotti di e-mail (come > 10 / sec).

Ecco una soluzione pigra ma corretta e adeguata. Utilizzare la seguente tabella di database come coda.

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
);

I mittenti devono inserire nuove righe alla fine di questa tabella.

Configura i thread di lavoro in modo da far apparire i messaggi uno alla volta dall'altra estremità (ID più basso) e provare a inviarli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top