Consejos sobre Python / Django y colas de mensajes


Tengo una aplicación en Django, que necesita enviar un gran número 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 message queue server que se integre bien con Python, o que haya usado en un proyecto Django? El resto de mi pila es Apache, mod_python, MySQL.

Author: Andy Hume, 2009-01-18

10 answers

Hasta ahora no he encontrado una solución "agradable" para esto. Tengo algunos requisitos más estrictos de tiempo real suave (tomar una foto de una caja de cartón que se etiqueta) así que probablemente uno de los enfoques es lo suficientemente rápido para usted. Asumo que los correos electrónicos pueden esperar unos minutos.

  • Una "lista de todo" en la base de datos procesada por un trabajo cron.
  • Una "lista de todo" en la base de datos procesada permanentemente siendo 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 colas con la pila IP para manejar la cola.
  • Usando ActiveMQ como agente de mensajes - esto no funcionó debido a problemas de estabilidad. También para mí los demonios Java son generalmente algo regordetes
  • Usando Disparadores de actualización en CouchDB. Agradable, pero los disparadores de actualización no están destinados a hacer un procesamiento de imágenes pesado, por lo que no es una buena opción para mi problema.

Hasta ahora no he probado RabbitMQ y XMPP / ejabebrd para el manejo el problema, pero están en mi lista de próximas cosas para probar. RabbitMQ obtuvo una conectividad Python decente durante 2008 y hay toneladas de bibliotecas XMPP.

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

 14
Author: max,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-13 12:35:54

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

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

  1. pybeanstalk / beanstalkd
  2. python interfaz para gearman (que es probablemente mucho más interesante ahora con el lanzamiento de la versión C de gearman)
  3. memcacheQ
  4. stomp
  5. Apio
 24
Author: Van Gale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-12 09:46:57

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 asíncrona.

Django guarda los correos electrónicos en la base de datos, un modelo.post_save handler en Django envía un evento a stompserver y stompserver pasa el evento a un proceso consumidor que hace la tarea asíncrona (envía el correo electrónico).

Se escala bastante bien debido a que 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 una manera round-robin. (Dos consumidores que escuchan en la misma cola obtendrán cada mensaje = duplicación). Si solo quieres un proceso de consumo, entonces esto no es un problema.

Nosotros anteriormente había procesos que sondeaban la base de datos continuamente para trabajos, pero encontraron que estaba agregando mucha carga al sistema, incluso cuando no era necesario procesar nada.

 6
Author: Gruff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-03 16:15:16

Simplemente agregue los correos electrónicos a una base de datos, y luego escriba otro script ejecutado por alguna utilidad de programador de tareas (cron viene a la mente) para enviar los correos electrónicos.

 1
Author: nosklo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-19 02:45:50

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 las colas.

 1
Author: dhruvbird,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-18 06:48:39

¿Hay algo malo en resolver esto usando la infraestructura de correo? Como, cada servidor de aplicaciones que ejecuta sus propios demonios de correo que pondrán en cola cualquier correo enviado localmente, que reenvían a un servidor de correo centralizado que puede hacer el trabajo pesado del correo?

 1
Author: Sandip Bhattacharya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-12 21:46:40

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

 1
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-20 07:21:04

Si ya tiene instalado MySQL, puede crear una tabla para usarla como una especie de "lista de tareas".

Los subprocesos agregan trabajos de forma sincrónica 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 y cuando no esté enviando lotes de correo electrónico (como >10/seg).

 0
Author: James Brady,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-18 11:34:32

Aquí hay una solución perezosa pero correcta y adecuada. Utilice la siguiente tabla de base de datos como 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.

Configurar hilos de trabajo para pop correos uno a la vez desde el otro extremo (id más bajo) y tratar de enviarlos.

 0
Author: Seun Osewa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-25 00:08:09

También puedes usar Twisted para esto. Pero no jugará con django en todos los casos, es muy dependiente de los escenarios de implementación. Lo más importante es que cada solicitud tiene que ser servida por un proceso python, por lo que necesita Apache compilado en modo threaded.

 -2
Author: Vasil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-18 22:21:53