Pergunta

Tenho uma aplicação web Pilões servido pelo Apache (mod_wsgi, prefork). Por causa do Apache, existem vários processos separados executando o meu código de aplicativo simultaneamente. Algumas das tarefas não-críticas que o aplicativo faz Eu quero adiar para o processamento em segundo plano para melhorar os tempos de resposta "ao vivo". Então, eu estou pensando em fila de tarefas, muitos Apache processos adicionando tarefas para esta fila, um único processo Python separado processá-los um por um e remoção da fila.

A fila deve ser preferencialmente mantidas no disco de modo fila tarefas não transformados não são perdidos por causa de falta de energia, servidor restart etc. A questão é o que seria uma forma razoável para implementar tais fila ?

Como para as coisas que eu tentei: Eu comecei com banco de dados SQLite simples e única tabela em que para armazenar itens de fila. Em testes de carga, quando o aumento do nível de concorrência, eu comecei a ficar "banco de dados bloqueado" erros, como esperado. A correção quick'n'dirty era substituir SQLite com MySQL - ele lida com problemas de simultaneidade bem, mas se sente como um exagero para a coisa simples que eu preciso fazer. operações de banco de dados relacionados com a fila também aparecem com destaque em meus relatórios de perfil.

Foi útil?

Solução

Um corretor mensagem como Apache do ActiveMQ é uma solução ideal aqui.

O gasoduto poderia ser a seguinte:

  • O processo de candidatura, que é responsável pelo tratamento de pedidos de HTTP gera respostas rapidamente e envia de baixa prioridade, tarefas pesadas para a fila AMQ.
  • Um ou mais outros processos estão inscritos para consumir fila AMQ e fazer o que tem a intenção de fazer com essas tarefas pesadas.

A exigência de fila de persistência é cumprida fora da caixa desde armazena mensagens ActiveMQ que ainda não são consumidos no armazenamento persistente. Além disso, as escalas muito bem desde que você está livre para implantar vários HTTP-apps, vários aplicativos de consumo ea própria AMQ em diferentes máquinas cada.

Nós usamos algo como isso em nosso projeto escrito em Python utilizando STOMP como subjacente protocolo de comunicação .

Outras dicas

servidor web A (qualquer servidor web) é multi-produtor, o processo para o consumidor individual.

Uma solução simples é construir um wsgiref ou Werkzeug servidor back-end para lidar com seus pedidos de back-end.

Uma vez que este servidor "back-end" é construído usando tecnologia WSGI, é muito, muito semelhante ao servidor web front-end. Exceto. Ela não produz respostas HTML (JSON é geralmente mais simples). Fora isso, é muito simples.

Você cria transações RESTful para este backend. Você usa todos os vários recursos WSGI para URI análise, autorização, autenticação, etc. Você - em geral - não precisa de gerenciamento de sessão, uma vez que os servidores RESTful não costumam oferecer sessões.

Se você entrar em problemas de escalabilidade graves, você simplesmente embrulhar o servidor back-end em lighttpd ou algum outro mecanismo de web para criar uma infra-estrutura de multi-threaded.

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