Pregunta

Tengo una aplicación en Django, que necesita enviar una gran cantidad de correos electrónicos a los usuarios en varios casos de uso. No quiero manejar esto sincrónicamente dentro de la aplicación por razones obvias.

¿Alguien tiene alguna recomendación para un servidor de colas de mensajes que se integre bien con Python, o que haya usado en un proyecto de Django? El resto de mi pila es Apache, mod_python, MySQL.

¿Fue útil?

Solución

Hasta ahora no he encontrado "agradable" solución para esto. Tengo algunos requisitos blandos más estrictos en tiempo real (tomar una foto de una caja de cartón con la etiqueta), por lo que probablemente uno de los enfoques sea lo suficientemente rápido para usted. Supongo que los correos electrónicos pueden esperar unos minutos.

  • Una " lista de tareas " en la base de datos procesada por un trabajo cron.
  • Una " lista de tareas " en la base de datos procesada permanentemente sondeada por un demonio.
  • Usando un demonio personalizado que es notificado por el servidor web a través de un paquete UDP (en producción hoy). Básicamente mi propio sistema de Queing con la pila de IP para manejar la cola.
  • Uso de ActiveMQ como agente de mensajes - esto no hacer ejercicio debido a problemas de estabilidad. También para mí, los demonios de Java son generalmente un tanto regordetes
  • Uso de disparadores de actualización en CouchDB. Agradable, pero los disparadores de actualización no están destinados a procesar imágenes pesadas, por lo que no encajan bien con mi problema.

Hasta ahora no he probado RabbitMQ y XMPP / ejabebrd para manejar el problema, pero están en mi lista de los próximos pasos para intentar. RabbitMQ obtuvo una conectividad Python decente durante 2008 y hay toneladas de bibliotecas XMPP.

Pero quizás todo lo que necesita es un servidor de correo configurado correctamente en la máquina local. Esto probablemente le permitiría volcar correos sincrónicamente en el servidor de correo local y, por lo tanto, hacer que toda su pila de software sea mucho más simple.

Otros consejos

En su caso específico, donde es solo una cola de correo electrónico, tomaré la salida fácil y usaré django-mailer . Como bonificación adicional, hay otros proyectos conectables que son lo suficientemente inteligentes como para aprovechar django-mailer cuando lo ven en la pila.

En cuanto a las soluciones de cola más generales, aún no he podido probar ninguna de estas, pero aquí hay una lista de las que me parecen más interesantes:

  1. pybeanstalk / beanstalkd
  2. interfaz de Python para gearman ( que probablemente sea mucho más interesante ahora con el lanzamiento de la versión C de gearman )
  3. memcacheQ
  4. stomp
  5. Apio

Stompserver es una buena opción. Es ligero, fácil de instalar y fácil de usar desde Django / python.

Tenemos un sistema que utiliza stompserver en producción para enviar correos electrónicos y procesar otros trabajos de forma asincrónica.

Django guarda los correos electrónicos en la base de datos, un controlador model.post_save en Django envía un evento a stompserver y stompserver pasa el evento a un proceso de consumidor que realiza la tarea asincrónica (envía el correo electrónico).

Se amplía bastante bien porque puede agregar procesos de consumo en tiempo de ejecución: dos consumidores pueden enviar el doble de correos electrónicos, y los consumidores pueden estar en máquinas separadas. Una pequeña complicación es que cada consumidor necesita su propia cola con nombre, por lo que Django necesita saber cuántos consumidores están disponibles y enviar eventos a cada cola de forma circular. (Dos consumidores que escuchan en la misma cola recibirán cada mensaje = duplicación). Si solo desea un proceso de consumidor, entonces este no es un problema.

Anteriormente teníamos procesos que sondeaban continuamente la base de datos en busca de trabajos, pero descubrimos que agregaba mucha carga al sistema, incluso cuando no era necesario procesar nada.

Simplemente agregue los correos electrónicos a una base de datos y luego escriba otra secuencia de comandos ejecutada por alguna utilidad del programador de tareas (me viene a la mente cron) para enviar los correos electrónicos.

Es posible que desee echar un vistazo a pymq . Está escrito en python, habla HTTP con sus clientes y permite una gran cantidad de opciones de monitoreo y administración para colas.

¿Hay algo malo en resolver esto usando la infraestructura de correo? Por ejemplo, ¿cada servidor de aplicaciones que ejecuta sus propios demonios de correo que pondrán en cola cualquier correo enviado localmente, que lo reenviará a un servidor de correo centralizado que pueda hacer el trabajo pesado del correo?

http://www.snakemq.net/ podría funcionar también

Si ya tiene instalado MySQL, puede crear una tabla para usar como " lista de tareas " de algún tipo.

Los subprocesos agregan trabajos sincrónicamente a la tabla, y una tarea por lotes elimina los trabajos a medida que se completan.

De esa manera, no hay necesidad de instalar y aprender más software, y debería funcionar bien como una tienda de trabajo persistente siempre que no envíe lotes de correo electrónico (como > 10 / seg).

Aquí hay una solución perezosa pero correcta y adecuada. Use la siguiente tabla de base de datos como una cola.

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

Los remitentes deben insertar nuevas filas al final de esta tabla.

Configure los subprocesos de trabajo para enviar correos uno a la vez desde el otro extremo (ID más bajo) e intente enviarlos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top