Pergunta

Eu tenho um aplicativo no Django, que as necessidades para enviar um grande número de e-mails para usuários em vários casos de uso. Eu não quero lidar com isso de forma síncrona dentro do aplicativo por razões óbvias.

Alguém tem alguma recomendação para um servidor de enfileiramento de mensagens que integra bem com Python, ou que tenham usado em um projeto de Django? O resto da minha pilha é o Apache, mod_python, MySQL.

Foi útil?

Solução

Até agora eu não encontrei nenhuma solução "agradável" para isso. Eu tenho alguns requisitos de tempo real suaves mais estritos (tirar uma foto de uma caixa de papelão ser rotulado) para que, provavelmente, uma das abordagens é rápido o suficiente para você. Presumo e-mails podem esperar por alguns minutos.

  • "lista de tarefas" Um no banco de dados processado por um trabalho cron.
  • A "lista de tarefas" no banco de dados processados ??permanentemente beeing consultado por um daemon.
  • Usando um daemon costume que é notificado pelo servidor através de um pacote UDP (em produção hoje). Basicamente meu próprio sistema Queing com a pilha IP para lidar com a fila.
  • Usando ActiveMQ como uma mensagem corretor - este não fez trabalhar fora por causa de problemas de estabilidade. Também me Java Daemons são geralmente um pouco gordo
  • Usando a Atualização Triggers no CouchDB. Bom, mas Atualização Triggers não são destinadas a fazer processamento de imagem pesada, de modo nenhum bom ajuste para o meu problema.

Até agora eu não tentei RabbitMQ e XMPP / ejabebrd para lidar com o problema, mas eles estão na minha lista de coisas próximas para tentar. RabbitMQ tem conectividade Python decente durante 2008 e há toneladas de bibliotecas XMPP.

Mas talvez tudo que você precisa é um servidor de correio configurado corretamente na máquina local. Isso provavelmente lhe permitiria despejar mails de forma síncrona para o servidor de correio local e, assim, tornar a sua pilha de software inteiro muito mais simples.

Outras dicas

No seu caso específico, onde é apenas uma fila de e-mail, eu Wold tomar o caminho mais fácil e usar django-mailer . Como um agradável bonues colaterais existem outros projectos conectáveis ??que são suficientemente inteligente para tirar proveito de django-mailer quando vê-lo na pilha.

Como para soluções mais gerais da fila, eu não tenho sido capaz de experimentar qualquer um destes ainda, mas aqui está uma lista de aqueles que parecem mais interessante para mim:

  1. pybeanstalk / beanstalkd
  2. python interface para gearman ( que é provavelmente muito mais interessante agora com o lançamento da versão C de gearman )
  3. memcacheQ
  4. pisão
  5. Aipo

Stompserver é uma boa opção. É leve, fácil de instalar e fácil de usar do Django / Python.

Temos um sistema usando stompserver na produção para o envio de e-mails e processar outros trabalhos de forma assíncrona.

Django salva os e-mails para o banco de dados, um manipulador model.post_save em Django envia um evento para stompserver e stompserver passa o evento a um processo consumidor que faz a tarefa assíncrona (envia o e-mail).

É escalas-se muito bem porque você pode adicionar processos de consumo em tempo de execução - dois consumidores podem enviar o dobro de e-mails, e os consumidores podem estar em máquinas separadas. Uma ligeira complicação é que cada consumidor precisa de sua própria fila chamado assim Django precisa saber quantos consumidores são eventos disponíveis e enviar para cada fila de uma maneira round-robin. (Dois consumidores escutando a mesma fila vai quer chegar cada mensagem = duplicação). Se você quer apenas um processo consumidor, então isso não é um problema.

Nós já teve processos que entrevistou o banco de dados continuamente por empregos, mas descobriu que era adicionando um monte de carga ao sistema, mesmo quando nada precisava ser processado.

Basta adicionar os e-mails a um banco de dados e, em seguida, escrever um outro correu roteiro de alguma utilidade agendador de tarefas (cron vem à mente) para enviar os e-mails.

Você pode querer ter um olhar para pymq . Ele é escrito em python, fala HTTP com ele é clientes e permite uma série de opções de gerenciamento de monitoramento e para filas.

Existe errado alguma coisa é resolver isso usando a infra-estrutura de e-mail? Como, cada servidor de aplicações rodando seus próprios daemons e-mail que irá fila qualquer e-mail enviado localmente, o que para a frente a um servidor de correio centralizado que pode fazer o trabalho de correio pesado?

http://www.snakemq.net/ pode funcionar tão bem

Se você já tem o MySQL instalado, você pode criar uma tabela para uso como uma "lista de tarefas" das sortes.

Threads de forma síncrona adicionar trabalhos para a mesa, e uma tarefa em lote remove empregos como eles estão concluídas.

Dessa forma, não há necessidade de instalar e aprender mais software, e ele deve funcionar bem como uma loja de trabalho persistente, desde que você não está enviando muitos de e-mail (como> 10 / seg ).

Aqui está uma solução preguiçosa, mas correta e adequada. Use a tabela de banco de dados a seguir como uma fila.

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

Os remetentes devem inserir novas linhas até o final desta tabela.

segmentos de trabalho de configuração de pop mails um de cada vez do outro lado (menor id) e tentar enviá-los.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top